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