更新時間:2020年11月30日16時08分 來源:傳智教育 瀏覽次數(shù):
Spring如何管理事務(wù)以及隔離級別?
(1)問題分析:
主要考察事務(wù)的4種隔離級別,如何使用spring進行事務(wù)管理及聲明式事務(wù)管理
(2)核心問題講解:
數(shù)據(jù)隔離級別分為不同的四種:
如果不考慮事務(wù)的隔離性,引發(fā)一些安全性問題:
1) 臟讀: 一個事務(wù)讀到另一個事務(wù)還沒有提交的數(shù)據(jù)。
不可重復讀: 一個事務(wù)讀到了另一個事務(wù)已經(jīng)提交的update的數(shù)據(jù),導致在當前的事務(wù)中多次查詢結(jié)果不一致。
2) 虛讀/幻讀: 一個事務(wù)讀到另一個事務(wù)已經(jīng)提交的insert的數(shù)據(jù),導致在當前的事務(wù)中多次的查詢結(jié)果不一致。
3) read uncommitted:未提交讀。臟讀,不可重復讀,虛讀都可能發(fā)生。
4) read committed:已提交讀.避免臟讀.但是不可重復讀和虛讀有可能發(fā)生。
5) repeatable read:可重復讀.避免臟讀,不可重復讀.但是虛讀有可能發(fā)生。
6) serializable:串行化的.避免臟讀,不可重復讀,虛讀的發(fā)生。
級別超高,越安全,效率越低。
Spring的事務(wù)機制包括聲明式事務(wù)和編程式事務(wù):
1) 編程式事務(wù)管理:Spring推薦使用TransactionTemplate,實際開發(fā)中使用聲明式事務(wù)較多。
2) 聲明式事務(wù)管理:將我們從復雜的事務(wù)處理中解脫出來,獲取連接,關(guān)閉連接、事務(wù)提交、回滾、異常處理等這些操作都不用我們處理了,Spring都會幫我們處理。
3) 聲明式事務(wù)管理使用了AOP面向切面編程實現(xiàn)的,本質(zhì)就是在目標方法執(zhí)行前后進行攔截。在目標方法執(zhí)行前加入或創(chuàng)建一個事務(wù),在執(zhí)行方法執(zhí)行后,根據(jù)實際情況選擇提交或是回滾事務(wù)。
(3)問題擴展
Spring的事務(wù)管理器
Spring并不直接管理事務(wù),而是提供了多種事務(wù)管理器,它們將事務(wù)管理的職責委托給JTA或其他持久化機制所提供的平臺相關(guān)的事務(wù)實現(xiàn)。每個事務(wù)管理器都會充當某一特定平臺的事務(wù)實現(xiàn)的門面,這使得用戶在Spring中使用事務(wù)時,幾乎不用關(guān)注實際的事務(wù)實現(xiàn)是什么。
Spring事務(wù)的只讀
“只讀事務(wù)”并不是一個強制選項,它只是一個“暗示”,提示數(shù)據(jù)庫驅(qū)動程序和數(shù)據(jù)庫系統(tǒng),這個事務(wù)并不包含更改數(shù)據(jù)的操作,那么JDBC驅(qū)動程序和數(shù)據(jù)庫就有可能根據(jù)這種情況對該事務(wù)進行一些特定的優(yōu)化,比方說不安排相應(yīng)的數(shù)據(jù)庫鎖,以減輕事務(wù)對數(shù)據(jù)庫的壓力,畢竟事務(wù)也是要消耗數(shù)據(jù)庫的資源的。“只讀事務(wù)”僅僅是一個性能優(yōu)化的推薦配置而已,并非強制你要這樣做不可。
Spring事務(wù)的事務(wù)超時
為了使應(yīng)用程序更好的運行,事務(wù)不能運行太長的時間。因此,聲明式事務(wù)的第四個特性就是超時。
Spring事務(wù)的回滾規(guī)則
默認情況下,事務(wù)只有在遇到運行期異常時才會回滾,而在遇到檢查型異常時不會回滾,但是也可以聲明事務(wù)在遇到特定的檢查型異常時像遇到運行期異常那樣回滾。同樣,你還可以聲明事務(wù)遇到特定的異常不回滾,即使這些異常是運行期異常。
(4)結(jié)合項目中使用
如何管理的:
1)Spring事務(wù)管理主要包括3個接口,Spring的事務(wù)主要是由他們?nèi)齻€共同完成的。
PlatformTransactionManager:事務(wù)管理器--主要用于平臺相關(guān)事務(wù)的管理主要有三個方法:
commit 事務(wù)提交;
rollback 事務(wù)回滾;
2)getTransaction 獲取事務(wù)狀態(tài)。
● TransactionDefinition:事務(wù)定義信息--用來定義事務(wù)相關(guān)的屬性,給事務(wù)管理器
● PlatformTransactionManager使用,這個接口有下面四個主要方法:
● getIsolationLevel:獲取隔離級別;
● getPropagationBehavior:獲取傳播行為;
● getTimeout:獲取超時時間;
● isReadOnly:是否只讀(保存、更新、刪除時屬性變?yōu)閒alse--可讀寫,查詢時為true--只讀)
事務(wù)管理器能夠根據(jù)這個返回值進行優(yōu)化,這些事務(wù)的配置信息,都可以通過配置文件進行配置。
3)TransactionStatus:事務(wù)具體運行狀態(tài)--事務(wù)管理過程中,每個時間點事務(wù)的狀態(tài)信息。
例如它的幾個方法:
● hasSavepoint():返回這個事務(wù)內(nèi)部是否包含一個保存點,
● isCompleted():返回該事務(wù)是否已完成,也就是說,是否已經(jīng)提交或回滾
● isNewTransaction():判斷當前事務(wù)是否是一個新事務(wù)
猜你喜歡