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