Spring事務(wù)的7種傳播機(jī)制

<meta charset="utf-8">

什么是傳播機(jī)制?

所謂傳播機(jī)制,指的就是 方法A帶有事務(wù),去調(diào)用方法帶有事務(wù)B,方法A,b事務(wù)設(shè)置的事務(wù)屬性,會(huì)對(duì)方法A,B的事務(wù)產(chǎn)生什么影響。

類中方法互相調(diào)用

  1. 方法A(不帶事務(wù))調(diào)用同類方法B(帶事務(wù))
image

B事務(wù)不會(huì)生效,因?yàn)锳方法不是增強(qiáng)方法,在代理對(duì)象中,A調(diào)用的是B的原生方法。必須得通過代理對(duì)象調(diào)用B的增強(qiáng)后的方法才能觸發(fā)B的事務(wù)。

  1. 方法A(帶事務(wù))調(diào)用方法B

由上可知,同類中調(diào)用B方法,B方法上的任務(wù)事務(wù)屬性都不會(huì)生效,不管你A的是否設(shè)置。但是由于是同類,用的是本身的對(duì)象,所以A+B其實(shí)是相當(dāng)于一個(gè)整體受A開啟的事務(wù)影響。

如果B是異類方法,那么B的事務(wù)會(huì)受到B方法上設(shè)置的事務(wù)傳播屬性影響。因?yàn)橛玫氖钱愵愖⑷脒M(jìn)來的代理對(duì)象,會(huì)觸發(fā)aop.

不同類中方法互相調(diào)用

分析這類方法一定要分兩部分來進(jìn)行,首先是A方法對(duì)事務(wù)的屬性,其次是B方法對(duì)事務(wù)的屬性。A方法對(duì)B方法的影響只存在于運(yùn)行A方法時(shí)是否已經(jīng)開啟事務(wù)。所以就會(huì)有7*7 49種情況。

<meta charset="utf-8">

image

注意:異常是否捕獲對(duì)事務(wù)的影響。

異常捕獲了就不會(huì)發(fā)生回滾?。?! 因?yàn)樵谑聞?wù)源碼中是通過 try{ 增強(qiáng)方法 }catch(Exception e){ 事務(wù)回滾。 } 增強(qiáng)方法自己處理的異常就不會(huì)被spring,catch到

1、PROPAGATION_REQUIRED

若當(dāng)前存在事務(wù),則加入該事務(wù),若不存在事務(wù),則新建一個(gè)事務(wù)。

所謂當(dāng)前,其實(shí)是上下文,比如B在A的事務(wù)范圍之內(nèi)。

實(shí)例:

  1. A:Propagation.REQUIRED B:Propagation.REQUIRED

執(zhí)行A時(shí),A發(fā)現(xiàn)當(dāng)前不存在事務(wù),會(huì)新建一個(gè)事務(wù),B被A調(diào)用,發(fā)現(xiàn)A已經(jīng)開啟事務(wù)了,共處一個(gè)上下文。所以就滿足當(dāng)前存在事務(wù)的條件,則使用A的事務(wù)。

結(jié)論:這種情況下,A和B為同一個(gè)事務(wù)。A和B中任何一個(gè)發(fā)生異常,都會(huì)一起回滾。

  1. A:Propagation.REQUIRED B:Propagation.REQUIRED_NEW

B設(shè)置為REQUIRED_NEW,如果存在事務(wù),則掛起當(dāng)前事務(wù): 這樣子A的事務(wù)只有當(dāng)B的事務(wù)完成之后,才會(huì)繼續(xù)執(zhí)行A的事務(wù)。B的事務(wù)可以說是獨(dú)立在A事務(wù)之中的。所以當(dāng)A存在異常時(shí),不會(huì)影響B(tài)的事務(wù).

結(jié)論: 當(dāng)A存在異常,B不存在,只有A回滾。B的事務(wù)在A回滾之前已經(jīng)結(jié)束

當(dāng)A不存在異常,B存在異常時(shí),只有B回滾。B的事務(wù)是獨(dú)立的。

當(dāng)AB同時(shí)存在異常時(shí),A的事務(wù)會(huì)在B事務(wù)完成之后再次進(jìn)行,所以是B回滾了之后,A再回滾。

3.A:Propagation.REQUIRED B:Propagation.REQUIRED_NESTED

執(zhí)行A時(shí),A發(fā)現(xiàn)當(dāng)前不存在事務(wù),會(huì)新建一個(gè)事務(wù),執(zhí)行B時(shí),發(fā)現(xiàn)已有事務(wù),掛起A的事務(wù),會(huì)新建一個(gè)子事務(wù).和Propagation.REQUIRED_NEW不同的時(shí),這種事務(wù)是有savepoint的,如果A存在異常,回滾,B的事務(wù)即使已經(jīng)提交仍然會(huì)回滾至savePoint.如果B存在異常,回滾之后,也同樣的會(huì)影響到A,導(dǎo)致A也跟著混滾。和第一種場(chǎng)景比較相似,但是第一種只存在一個(gè)事務(wù),這種是有兩個(gè)事務(wù),但是會(huì)互相影響,效果的話和第一種差不多。

4. Propagation.REQUIRED B:Propagation.REQUIRED_NEVER

執(zhí)行A時(shí),A發(fā)現(xiàn)當(dāng)前不存在事務(wù),會(huì)新建一個(gè)事務(wù),執(zhí)行B時(shí),發(fā)現(xiàn)已有事務(wù),會(huì)拋異常,并且不會(huì)執(zhí)行業(yè)務(wù)代碼.拋出的異常會(huì)導(dǎo)致A也進(jìn)行回滾。

5. Propagation.REQUIRED B:Propagation.NOT_SUPPORTS

執(zhí)行A時(shí),A發(fā)現(xiàn)當(dāng)前不存在事務(wù),會(huì)新建一個(gè)事務(wù),執(zhí)行B時(shí),發(fā)現(xiàn)已有事務(wù),掛起A事務(wù),B是不存在事務(wù)的(B出現(xiàn)異常也不回滾)。當(dāng)B執(zhí)行完之后,再進(jìn)行A的事務(wù)。

其他的各種情況 跟上面這樣分析即可。

轉(zhuǎn)載自:http://www.itdecent.cn/p/131bbd9bf0c8

?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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