Spring事務(wù)的隔離級(jí)別和傳播行為
一、簡(jiǎn)述
Spring 在 TransactionDefinition 接口中規(guī)定了7種類型的事務(wù)傳播行為。事務(wù)傳播行為是 Spring 框架獨(dú)有的事務(wù)增強(qiáng)特性,它不屬于的事務(wù)實(shí)際提供方數(shù)據(jù)庫(kù)行為。這是 Spring 提供的強(qiáng)大的工具箱,使用事務(wù)傳播行為可以提供許多便利。但是人們對(duì)事務(wù)的誤解也頗多,你一定也聽過“service方法事務(wù)最好不要嵌套”的傳言。要想正確的使用工具首先需要了解工具。本文對(duì)七種事務(wù)傳播行為做詳細(xì)介紹,內(nèi)容主要代碼示例的方式呈現(xiàn)。
二、基礎(chǔ)概念
1??什么是事務(wù)傳播行為?
事務(wù)傳播行為用來描述由某一個(gè)事務(wù)傳播行為修飾的方法被嵌套進(jìn)另一個(gè)方法時(shí)的事務(wù)如何傳播。用偽代碼說明:代碼中methodA()嵌套調(diào)用了methodB(),methodB()的事務(wù)傳播行為由@Transaction(Propagation=XXX)設(shè)置決定。這里需要注意的是methodA()并沒有開啟事務(wù),某一個(gè)事務(wù)傳播行為修飾的方法并不是必須要在開啟事務(wù)的外圍方法中調(diào)用。
2??Spring中七種事務(wù)傳播行為
三、代碼驗(yàn)證
1??首先在數(shù)據(jù)庫(kù)中創(chuàng)建兩張表:
user1:2??然后編寫相應(yīng)的Bean和DAO層代碼:
User1:3??最后也是具體驗(yàn)證的代碼由service層實(shí)現(xiàn),下面分情況列舉。
1.PROPAGATION_REQUIRED
為User1Service和User2Service相應(yīng)方法加上Propagation.REQUIRED屬性。
User1Service方法:1.1 場(chǎng)景一
此場(chǎng)景外圍方法沒有開啟事務(wù)。
驗(yàn)證方法1:結(jié)論:通過這兩個(gè)方法證明了在外圍方法未開啟事務(wù)的情況下Propagation.REQUIRED修飾的內(nèi)部方法會(huì)新開啟自己的事務(wù),且開啟的事務(wù)相互獨(dú)立,互不干擾。
1.2 場(chǎng)景二
外圍方法開啟事務(wù),這個(gè)是使用率比較高的場(chǎng)景。
驗(yàn)證方法1:結(jié)論:以上試驗(yàn)結(jié)果證明在外圍方法開啟事務(wù)的情況下Propagation.REQUIRED修飾的內(nèi)部方法會(huì)加入到外圍方法的事務(wù)中,所有Propagation.REQUIRED修飾的內(nèi)部方法和外圍方法均屬于同一事務(wù),只要一個(gè)方法回滾,整個(gè)事務(wù)均回滾。
2.PROPAGATION_REQUIRES_NEW
為User1Service和User2Service相應(yīng)方法加上Propagation.REQUIRES_NEW屬性。
User1Service方法:2.1 場(chǎng)景一
外圍方法沒有開啟事務(wù)。
驗(yàn)證方法1:結(jié)論:通過這兩個(gè)方法證明了在外圍方法未開啟事務(wù)的情況下Propagation.REQUIRES_NEW修飾的內(nèi)部方法會(huì)新開啟自己的事務(wù),且開啟的事務(wù)相互獨(dú)立,互不干擾。
2.2 場(chǎng)景二
外圍方法開啟事務(wù)。
驗(yàn)證方法1:結(jié)論:在外圍方法開啟事務(wù)的情況下Propagation.REQUIRES_NEW修飾的內(nèi)部方法依然會(huì)單獨(dú)開啟獨(dú)立事務(wù),且與外部方法事務(wù)也獨(dú)立,內(nèi)部方法之間、內(nèi)部方法和外部方法事務(wù)均相互獨(dú)立,互不干擾。
3.PROPAGATION_NESTED
3.1 場(chǎng)景一
此場(chǎng)景外圍方法沒有開啟事務(wù)。
驗(yàn)證方法1:結(jié)論:通過這兩個(gè)方法證明了在外圍方法未開啟事務(wù)的情況下Propagation.NESTED和Propagation.REQUIRED作用相同,修飾的內(nèi)部方法都會(huì)新開啟自己的事務(wù),且開啟的事務(wù)相互獨(dú)立,互不干擾。
3.2 場(chǎng)景二
外圍方法開啟事務(wù)。
驗(yàn)證方法1:結(jié)論:以上試驗(yàn)結(jié)果證明在外圍方法開啟事務(wù)的情況下
Propagation.NESTED
修飾的內(nèi)部方法屬于外部事務(wù)的子事務(wù),外圍主事務(wù)回滾,子事務(wù)一定回滾,而內(nèi)部子事務(wù)可以單獨(dú)回滾而不影響外圍主事務(wù)和其他子事務(wù)
- REQUIRED、REQUIRES_NEW、NESTED異同
由“1.2 場(chǎng)景二”和“3.2 場(chǎng)景二”對(duì)比,可知:
NESTED和REQUIRED修飾的內(nèi)部方法都屬于外圍方法事務(wù),如果外圍方法拋出異常,這兩種方法的事務(wù)都會(huì)被回滾。但是REQUIRED是加入外圍方法事務(wù),所以和外圍事務(wù)同屬于一個(gè)事務(wù),一旦REQUIRED事務(wù)拋出異常被回滾,外圍方法事務(wù)也將被回滾。而NESTED是外圍方法的子事務(wù),有單獨(dú)的保存點(diǎn),所以NESTED方法拋出異常被回滾,不會(huì)影響到外圍方法的事務(wù)。
由“2.2 場(chǎng)景二”和“3.2 場(chǎng)景二”對(duì)比,可知:
NESTED和REQUIRES_NEW都可以做到內(nèi)部方法事務(wù)回滾而不影響外圍方法事務(wù)。但是因?yàn)镹ESTED是嵌套事務(wù),所以外圍方法回滾之后,作為外圍方法事務(wù)的子事務(wù)也會(huì)被回滾。而REQUIRES_NEW是通過開啟新的事務(wù)實(shí)現(xiàn)的,內(nèi)部事務(wù)和外圍事務(wù)是兩個(gè)事務(wù),外圍事務(wù)回滾不會(huì)影響內(nèi)部事務(wù)。
- 其他事務(wù)傳播行為
不說了