日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語言 正文

Spring的隔離級(jí)別&事務(wù)傳播屬性&數(shù)據(jù)庫(kù)隔離級(jí)別之間的聯(lián)系

作者:洋洋洋coding 更新時(shí)間: 2022-07-16 編程語言
一、Spring五大事務(wù)隔離級(jí)別
Spring事務(wù)隔離級(jí)別比數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別多一個(gè)default
在進(jìn)行配置的時(shí)候,如果數(shù)據(jù)庫(kù)和spring代碼中的隔離級(jí)別不同,那么以spring的配置為主。


1) DEFAULT (默認(rèn))
這是一個(gè)PlatfromTransactionManager默認(rèn)的隔離級(jí)別,使用數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別。另外四個(gè)與MySQL的隔離級(jí)別相對(duì)應(yīng)。

2) READ_UNCOMMITTED (讀未提交)
這是事務(wù)最低的隔離級(jí)別,它允許另外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。這種隔離級(jí)別會(huì)產(chǎn)生臟讀,不可重復(fù)讀和幻像讀。

3) READ_COMMITTED (讀已提交)
保證一個(gè)事務(wù)修改的數(shù)據(jù)提交后才能被另外一個(gè)事務(wù)讀取,另外一個(gè)事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)。這種事務(wù)隔離級(jí)別可以避免臟讀出現(xiàn),
但是可能會(huì)出現(xiàn)不可重復(fù)讀和幻讀。

4) REPEATABLE_READ (可重復(fù)讀)
這種事務(wù)隔離級(jí)別可以防止臟讀、不可重復(fù)讀,但是可能出現(xiàn)幻讀。它除了保證一個(gè)事務(wù)不能讀取另一個(gè)事務(wù)未提交的數(shù)據(jù)外,
還保證了不可重復(fù)讀。

5) SERIALIZABLE(串行化)
這是花費(fèi)最高代價(jià)但是最可靠的事務(wù)隔離級(jí)別,事務(wù)被處理為順序執(zhí)行。除了防止臟讀、不可重復(fù)讀外,還避免了幻讀。

隔離級(jí)別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對(duì)并發(fā)性能的影響也越大。對(duì)于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫(kù)系統(tǒng)的
隔離級(jí)別設(shè)為Read Committed。它能夠避免臟讀取,而且具有較好的并發(fā)性能。盡管它會(huì)導(dǎo)致不可重復(fù)讀、幻讀和第二類丟失更新
這些并發(fā)問題,在可能出現(xiàn)這類問題的個(gè)別場(chǎng)合,可以由應(yīng)用程序采用悲觀鎖或樂觀鎖來控制。

二、Spring七大事務(wù)傳播屬性
1) required(默認(rèn)屬性)
如果存在一個(gè)事務(wù),則支持當(dāng)前事務(wù)。如果沒有事務(wù)則開啟一個(gè)新的事務(wù)。
被設(shè)置成這個(gè)級(jí)別時(shí),會(huì)為每一個(gè)被調(diào)用的方法創(chuàng)建一個(gè)邏輯事務(wù)域。如果前面的方法已經(jīng)創(chuàng)建了事務(wù),那么后面的方法支持當(dāng)前的事務(wù),
如果當(dāng)前沒有事務(wù)會(huì)重新建立事務(wù)。

2) Mandatory
支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。

3) Never
以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。

4) Not_supports
以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。

5) requires_new
新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。

6) Supports
支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行。

7) Nested
支持當(dāng)前事務(wù),新增Savepoint點(diǎn),與當(dāng)前事務(wù)同步提交或回滾。
嵌套事務(wù)一個(gè)非常重要的概念就是內(nèi)層事務(wù)依賴于外層事務(wù)。外層事務(wù)失敗時(shí),會(huì)回滾內(nèi)層事務(wù)所做的動(dòng)作。而內(nèi)層事務(wù)操作失敗并不會(huì)引起外層事務(wù)的回滾。

三、Spring隔離級(jí)別與數(shù)據(jù)庫(kù)隔離級(jí)別聯(lián)系
spring事務(wù)本質(zhì)上使用數(shù)據(jù)庫(kù)事務(wù),而數(shù)據(jù)庫(kù)事務(wù)本質(zhì)上使用數(shù)據(jù)庫(kù)鎖,所以spring事務(wù)本質(zhì)上使用數(shù)據(jù)庫(kù)鎖,開啟spring事務(wù)意味著使用數(shù)據(jù)庫(kù)鎖;

事務(wù)的隔離級(jí)別是通過鎖的機(jī)制實(shí)現(xiàn)的,事務(wù)的隔離級(jí)別是數(shù)據(jù)庫(kù)開發(fā)商根據(jù)業(yè)務(wù)邏輯的實(shí)際需要定義的一組鎖的使用策略。
當(dāng)我們將數(shù)據(jù)庫(kù)的隔離級(jí)別定義為某一級(jí)別后如仍不能滿足要求,我們可以自定義 sql 的鎖來覆蓋事務(wù)隔離級(jí)別默認(rèn)的鎖機(jī)制。

spring事務(wù)實(shí)際使用AOP攔截注解方法,然后使用動(dòng)態(tài)代理處理事務(wù)方法,捕獲處理過程中的異常,spring事務(wù)其實(shí)是把異常交給spring處理;

spring事務(wù)只有捕獲到異常才會(huì)終止或回滾,如果你在程序中try/catch后自己處理異常而沒有throw,那么事務(wù)將不會(huì)終止或回滾,
失去事務(wù)本來的作用;

spring事務(wù)會(huì)捕獲所有的異常,但只會(huì)回滾數(shù)據(jù)庫(kù)相關(guān)的操作,并且只有在聲明了rollbackForClassName="Exception"之類的配置才會(huì)回滾。

spring事務(wù)會(huì)回滾同一事務(wù)中的所有數(shù)據(jù)庫(kù)操作,本質(zhì)上是回滾同一數(shù)據(jù)庫(kù)連接上的數(shù)據(jù)庫(kù)操作。

原文鏈接:https://blog.csdn.net/weixin_56311692/article/details/125774279

欄目分類
最近更新