1. 程式人生 > >Spring事務的傳播特性

Spring事務的傳播特性

所謂事務的巢狀就是兩個事務方法之間相互呼叫。spring事務開啟 ,或者是基於介面的或者是基於類的代理被建立(注意一定要是代理,不能手動new 一個物件,並且此類(有無介面都行)一定要被代理——spring中的bean只要納入了IOC管理都是被代理的)。

所謂事務傳播行為就是多個事務方法相互呼叫時,事務如何在這些方法間傳播。Spring 支援 7 種事務傳播行為(Transaction Propagation Behavior):

傳播行為 描述
PROPAGATION_REQUIRED 如果沒有,就開啟一個事務;如果有,就加入當前事務(方法B看到自己已經執行在 方法A的事務內部,就不再起新的事務,直接加入方法A)
RROPAGATION_REQUIRES_NEW 如果沒有,就開啟一個事務;如果有,就將當前事務掛起。(方法A所在的事務就會掛起,方法B會起一個新的事務,等待方法B的事務完成以後,方法A才繼續執行)
PROPAGATION_NESTED 如果沒有,就開啟一個事務;如果有,就在當前事務中巢狀其他事務
PROPAGATION_SUPPORTS 如果沒有,就以非事務方式執行;如果有,就加入當前事務(方法B看到自己已經執行在 方法A的事務內部,就不再起新的事務,直接加入方法A)
PROPAGATION_NOT_SUPPORTED 如果沒有,就以非事務方式執行;如果有,就將當前事務掛起,(方法A所在的事務就會掛起,而方法B以非事務的狀態執行完,再繼續方法A的事務)
PROPAGATION_NEVER 如果沒有,就以非事務方式執行;如果有,就丟擲異常。
PROPAGATION_MANDATORY 如果沒有,就丟擲異常;如果有,就使用當前事務

其中前4種是開發中用到概率比較大的,建議熟記;後面3種不常用,瞭解就行。

我們經常會提到,方法A傳播到方法B,那到底是A呼叫B,還是B呼叫A,這個問題我一開始學Spring的時候犯渾過,搞反了,導致久久理解不了。其實只要仔細斟酌字面意思就不會像我那樣犯傻了。

A傳播到B,顯而易見進入A方法執行半途中,再次進入B方法,這才叫做傳播到方法B中。