spring 事務(wù)管理之事務(wù)的七大傳播行為之理論

譬如朝露,去日苦多

事務(wù)傳播行為: Propagation [?pr?p?'ɡe??(?)n]

spring 給我們提供了7大傳播行為;我們打開org.springframework.transaction.annotation.Propagation類源碼可以分別看到這7種:


image.png

這里提出一個概念,方便下面的理解

  • 調(diào)用者方法
  • 被調(diào)用者方法

事務(wù)的傳播行為指的是:當事務(wù)方法嵌套調(diào)用時, 調(diào)用者事務(wù)被調(diào)用者事務(wù)沖突的解決方案。spring為我們提供了7種解決方案

支持調(diào)用者事務(wù)

required [r??kwa??rd]

(必須的)
這是spring默認的事務(wù)傳播行為

  • 申明在被調(diào)用者上,調(diào)用者沒有開啟事務(wù),則被調(diào)用者開啟事務(wù);調(diào)用者有開啟事務(wù),則被調(diào)用者加入調(diào)用者事務(wù)。即優(yōu)先使用調(diào)用者事務(wù),此時內(nèi)部出現(xiàn)異常回滾會使外部調(diào)用者事務(wù)方法也回滾

  • 申明在調(diào)用者上,會創(chuàng)建新事務(wù)

就好像在公司遇到前端的樣式問題一樣,前端在就找前端解決,不在就自己解決

@Transactional(propagation=Propagation.REQUIRED) 
supports

(支持)
本身不會創(chuàng)建事務(wù)

  • 申明在被調(diào)用者上,調(diào)用者沒有開啟事務(wù),則被調(diào)用者方法就是一個不帶事務(wù)的方法。調(diào)用者有開啟事務(wù),則被調(diào)用者加入調(diào)用者事務(wù)
  • 申明在調(diào)用者上,當前方法以非事務(wù)方式運行

就像遇到前端問題,就把問題忽略。不去解決

@Transactional(propagation=Propagation.SUPPORTS) 
mandatory [?m?nd?t??ri]

(強制)
本身不會創(chuàng)建事務(wù)

  • 申明在被調(diào)用者上,當前方法必須使用調(diào)用者的事務(wù),如果調(diào)用者有事務(wù),就加入。如果沒有就拋出IllegalTransactionStateException異常
  • 申明在調(diào)用者上,報異常IllegalTransactionStateException

就像遇到了比較難以解決的前端問題。前端不在,自己也解決不了

@Transactional(propagation=Propagation.MANDATORY) 

不支持調(diào)用者事務(wù)

requires_new

(隔離)

  • 申明在被調(diào)用者上,不管調(diào)用者是否使用事務(wù)會都創(chuàng)建一個新的事務(wù),調(diào)用者中的事務(wù)掛起,等到被調(diào)用者事務(wù)執(zhí)行完畢,繼續(xù)執(zhí)行調(diào)用者中的事務(wù)。一般局部數(shù)據(jù)操作一致性都用此方法。
  • 申明在調(diào)用者上,會創(chuàng)建新事務(wù)
@Transactional(propagation=Propagation.REQUIRES_NEW) 
not_supported

(不支持)
本身不會創(chuàng)建事務(wù)。

  • 申明在被調(diào)用者上方法上。調(diào)用者事務(wù)方法調(diào)用此方法時,事務(wù)不會進到此方法。即把外部事務(wù)掛起,直到此方法執(zhí)行完后恢復外部事務(wù)。
  • 申明在調(diào)用者上,當前方法以非事務(wù)方式運行
@Transactional(propagation=Propagation.NOT_SUPPORTED) 
never

(強制非事務(wù))
本身不會創(chuàng)建事務(wù)。

  • 申明在被調(diào)用者方法上,調(diào)用者方法上使用了事務(wù)則報IllegalTransactionStateException
    異常
  • 申明在調(diào)用者上,當前方法以非事務(wù)方式運行
@Transactional(propagation=Propagation.NEVER) 

嵌套事務(wù)

nested [?nest?d]

(嵌套事務(wù))

開始一個 "嵌套的" 事務(wù), 它是已經(jīng)存在事務(wù)的一個真正的子事務(wù)。嵌套事務(wù)開始執(zhí)行時, 它將取得一個 savepoint。 如果這個嵌套事務(wù)失敗, 我們將回滾到此 savepoint。嵌套事務(wù)是外部事務(wù)的一部分, 只有外部事務(wù)結(jié)束后它才會被提交。

 @Transactional(propagation= Propagation.NESTED)

我對事務(wù)傳播行為的個人理解

事務(wù)總是沿著方法的調(diào)用方向來傳播的,A方法調(diào)用B方法,A方法的事務(wù)可能會傳播給B方法。不存在B方法事務(wù)傳播給A方法!具體分為下面幾種情況:

  • A創(chuàng)建了事務(wù),并將事務(wù)傳播給B。兩者使用同一事務(wù)

  • A創(chuàng)建了事務(wù),B也創(chuàng)建了事務(wù)。兩者隔離執(zhí)行

  • A創(chuàng)建了事務(wù),B無事務(wù)運行

  • A無事務(wù)運行,B創(chuàng)建事務(wù)

  • A無事務(wù)運行,B無事務(wù)運行

為了深入理解事務(wù)的傳播行為,我對之做了實驗。這篇文章有記錄
http://www.itdecent.cn/p/bc3cbacf9e70

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

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

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