Spring事務(wù)傳播行為詳解

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:

user2:

2??然后編寫相應(yīng)的Bean和DAO層代碼:

User1:

User2:

User1Mapper:

User2Mapper:

3??最后也是具體驗(yàn)證的代碼由service層實(shí)現(xiàn),下面分情況列舉。

1.PROPAGATION_REQUIRED

為User1Service和User2Service相應(yīng)方法加上Propagation.REQUIRED屬性。

User1Service方法:

User2Service方法:

1.1 場(chǎng)景一

此場(chǎng)景外圍方法沒有開啟事務(wù)。

驗(yàn)證方法1:

驗(yàn)證方法2:

分別執(zhí)行驗(yàn)證方法,結(jié)果:

結(jié)論:通過這兩個(gè)方法證明了在外圍方法未開啟事務(wù)的情況下Propagation.REQUIRED修飾的內(nèi)部方法會(huì)新開啟自己的事務(wù),且開啟的事務(wù)相互獨(dú)立,互不干擾。

1.2 場(chǎng)景二

外圍方法開啟事務(wù),這個(gè)是使用率比較高的場(chǎng)景。

驗(yàn)證方法1:

驗(yàn)證方法2:

驗(yàn)證方法3:

分別執(zhí)行驗(yàn)證方法,結(jié)果:

結(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方法:

User2Service方法:

2.1 場(chǎng)景一

外圍方法沒有開啟事務(wù)。

驗(yàn)證方法1:

驗(yàn)證方法2:

分別執(zhí)行驗(yàn)證方法,結(jié)果:

結(jié)論:通過這兩個(gè)方法證明了在外圍方法未開啟事務(wù)的情況下Propagation.REQUIRES_NEW修飾的內(nèi)部方法會(huì)新開啟自己的事務(wù),且開啟的事務(wù)相互獨(dú)立,互不干擾。

2.2 場(chǎng)景二

外圍方法開啟事務(wù)。

驗(yàn)證方法1:

驗(yàn)證方法2:

驗(yàn)證方法3:

分別執(zhí)行驗(yàn)證方法,結(jié)果:

結(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:

驗(yàn)證方法2:

分別執(zhí)行驗(yàn)證方法,結(jié)果:

結(jié)論:通過這兩個(gè)方法證明了在外圍方法未開啟事務(wù)的情況下Propagation.NESTED和Propagation.REQUIRED作用相同,修飾的內(nèi)部方法都會(huì)新開啟自己的事務(wù),且開啟的事務(wù)相互獨(dú)立,互不干擾。

3.2 場(chǎng)景二

外圍方法開啟事務(wù)。

驗(yàn)證方法1:

驗(yàn)證方法2:

驗(yàn)證方法3:

分別執(zhí)行驗(yàn)證方法,結(jié)果:

結(jié)論:以上試驗(yàn)結(jié)果證明在外圍方法開啟事務(wù)的情況下

Propagation.NESTED

修飾的內(nèi)部方法屬于外部事務(wù)的子事務(wù),外圍主事務(wù)回滾,子事務(wù)一定回滾,而內(nèi)部子事務(wù)可以單獨(dú)回滾而不影響外圍主事務(wù)和其他子事務(wù)

  1. 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ù)。

  1. 其他事務(wù)傳播行為
    不說了
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容