<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)用
- 方法A(不帶事務(wù))調(diào)用同類方法B(帶事務(wù))

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

注意:異常是否捕獲對(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í)例:
- 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ì)一起回滾。
- 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