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

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

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

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

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

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

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

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

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

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

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

<meta charset="utf-8">

image.png

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

異常捕獲了就不會發(fā)生回滾?。?! 因?yàn)樵谑聞?wù)源碼中是通過 try{ 增強(qiáng)方法 }catch(Exception e){ 事務(wù)回滾。 } 增強(qiáng)方法自己處理的異常就不會被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ù),會新建一個(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ā)生異常,都會一起回滾。

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

B設(shè)置為REQUIRED_NEW,如果存在事務(wù),則掛起當(dāng)前事務(wù): 這樣子A的事務(wù)只有當(dāng)B的事務(wù)完成之后,才會繼續(xù)執(zhí)行A的事務(wù)。B的事務(wù)可以說是獨(dú)立在A事務(wù)之中的。所以當(dāng)A存在異常時(shí),不會影響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ù)會在B事務(wù)完成之后再次進(jìn)行,所以是B回滾了之后,A再回滾。

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

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

4. Propagation.REQUIRED B:Propagation.REQUIRED_NEVER

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

5. Propagation.REQUIRED B:Propagation.NOT_SUPPORTS

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

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

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

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

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