spring的事務(wù)的隔離級別和傳播屬性

之前一直懶得記這些東西,因為感覺這些東西有點散,不好記,后來也就懶得記了,慢慢的就淡忘了,現(xiàn)在決定重新把丟失的東西撿起來。
在此之前我們先來明確幾個概念:

臟讀:指當(dāng)一個事務(wù)正在訪問數(shù)據(jù)庫,并且對數(shù)據(jù)庫進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中去,這時,另外一個事務(wù)也在訪問這個數(shù)據(jù),然后使用了數(shù)據(jù),因為這個數(shù)據(jù)是沒有提交的數(shù)據(jù),那么另外一個事務(wù)讀取到的就是一個臟數(shù)據(jù),因為沒有提交的數(shù)據(jù)(臟數(shù)據(jù))是有可能回滾的,所以依據(jù)臟數(shù)據(jù)所做的操作也就有可能是不正確的。

不可重復(fù)讀:指在一個事務(wù)內(nèi)多次讀取同一個數(shù)據(jù)。在這個事務(wù)沒有結(jié)束時,另外一個事務(wù)也在訪問這個數(shù)據(jù),那么在第一個事務(wù)多次讀之間,由于第二個事務(wù)的修改(update 或者delete),那么第一個事務(wù)的多次讀取到的數(shù)據(jù)就有可能是不一樣的,這樣就發(fā)生了在同一個事物多次讀到的數(shù)據(jù)是不一樣的,這就叫做不可重復(fù)讀。

幻讀:指事物不是獨立執(zhí)行的時候發(fā)生的一種現(xiàn)象,比如,第一個事務(wù)對一個表中的數(shù)據(jù)數(shù)據(jù)進(jìn)行了修改,這種修改又涉及到了這個整張表的修改,但是這個時候,第二個事務(wù)向事務(wù)中添加了一條數(shù)據(jù),那么,可能就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)數(shù)據(jù)還有一條沒有修改的數(shù)據(jù),仿佛發(fā)生了幻覺一樣。
在這些上邊的概念當(dāng)中一定要注意讀和修改的字眼,這樣才能真正的理解這幾個概念。

下面我們來看數(shù)據(jù)庫的隔離級別,說起數(shù)據(jù)庫的隔離級別主要有:
讀未提交(read-uncommited):會產(chǎn)生臟讀,也就是會讀取到其他事務(wù)沒有提交的數(shù)據(jù)
read-comminted(讀提交):讀取的是事務(wù)已經(jīng)提交后的數(shù)據(jù),可以避免臟讀,但是不可以避免不可重復(fù)讀和幻讀
可重復(fù)讀(repeateable-read):可重復(fù)讀,他除了可以保證一個事務(wù)不能讀取另外一個事務(wù)提交的數(shù)據(jù)以外,還能保證避免不可重復(fù)都,但是不能保證不出現(xiàn)幻讀。
串行化(serializable):這個是消費代價最高的一個,但也是隔離級別最高的一個,它能防止臟讀,不可重復(fù)都,還避免了幻讀。

spring的事務(wù)的隔離級別

了解了這些我們就可以很輕松的來理解spring的事務(wù)的隔離級別了,spring 的事務(wù)的隔離級別主要有以下五個級別:
1、isolation_default:這個是platformTranscationManger默認(rèn)的級別,使用的是數(shù)據(jù)庫的默認(rèn)隔離級別,也就是說我們所用的數(shù)據(jù)庫默認(rèn)是什么級別,那我們的spring就用什么級別的。大多數(shù)的數(shù)據(jù)庫系統(tǒng)的默認(rèn)事務(wù)隔離級別都是:Read committed,而mysql的默認(rèn)的隔離級是REPEATABLE-READ,我們可以使用 select @@global.tx_isolation 這個命令來查看我們的所使用過的事務(wù)的隔離級別。
下面的四個是跟我的數(shù)據(jù)的級別對應(yīng)的

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

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

5、isolation_repeatable_read (可重復(fù)讀)
這種事務(wù)隔離級別可以防止臟讀,不可重復(fù)讀。但是可能出現(xiàn)幻像讀(現(xiàn)在mysql官網(wǎng)說是可以避免幻讀)。它除了保證一個事務(wù)不能讀取另一個事務(wù)未提交的數(shù)據(jù)外,還保證了不可重復(fù)讀

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

spring事務(wù)的傳播屬性

spring的傳播屬性有以下七種:
1、propagation_required:意思是如果存在一個事務(wù),則支持
當(dāng)前事務(wù),如果沒有事務(wù),則開啟這個事務(wù)。
2、propagation_support:意思是如果存在一個事務(wù)就支持當(dāng)前事務(wù),如果沒有事務(wù)則不執(zhí)行事務(wù)。
3、propagation_mandatory:如果有事務(wù)就執(zhí)行事務(wù),沒有則拋出異常。
4、propagation_requires_new:表示總是開啟一個新的事務(wù),如果已經(jīng)存在一個事務(wù)則將這個事務(wù)掛起。
5、propagation_not_supported:總是以非事務(wù)執(zhí)行,并掛起任何事物
6、propagation_never:總是非事務(wù)執(zhí)行,如果存在一個事務(wù)活動,則拋出異常
7、propagation_nested:如果一個活動的事務(wù)存在,則運行在一個嵌套事務(wù)當(dāng)中,如果沒有事務(wù),則按照Transaction.propagation_required屬性執(zhí)行。

總結(jié)

總的來說spring的事務(wù)的隔離級別是可以理解為操作數(shù)據(jù)庫層面的,而傳播屬性是操作邏輯層面的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容