譬如朝露,去日苦多
事務(wù)傳播行為: Propagation [?pr?p?'ɡe??(?)n]
spring 給我們提供了7大傳播行為;我們打開org.springframework.transaction.annotation.Propagation類源碼可以分別看到這7種:

這里提出一個概念,方便下面的理解
- 調(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