Propagation是一個枚舉,定義了七大行為類型,下以分別解釋。
REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED)
官方解釋:支持當前事務;如果不存在,就創(chuàng)建一個新的。類似于同名的EJB事務屬性。這通常是交易定義的默認設置,通常定義事務同步作用域。
深入理解:required 屬性表達了被標識的參數(shù)或方法是必須要存在的,否則就會報錯。類似地Spring mvc 中 @required String name。
如果是事務方法嵌套調(diào)用,標有required的方法會將外事務直接拿過來使用,如果此事內(nèi)部出現(xiàn)異?;貪L會使外事務方法也回滾??!
所以一般為了保證局部數(shù)據(jù)的一致性會使用REQIRED_NEW。
SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS)
官方解釋:支持當前事務;如果不存在,則執(zhí)行非事務。類似于同名的EJB事務屬性。注意:對于具有事務同步的事務管理器來說,傳播支持與根本沒有事務略有不同,因為它定義了同步可能應用于的事務范圍。因此,相同的資源(JDBC連接、Hibernate會話等)將被共享到整個指定的范圍。注意,準確的行為取決于事務管理器的實際同步配置!一般來說,使用傳播支持!特別地,不要依賴于傳播支持范圍內(nèi)的傳播所需或傳播的需求(這可能導致在運行時發(fā)生同步?jīng)_突)。如果這樣的嵌套是不可避免的,請確保適當?shù)嘏渲媚氖聞展芾砥鳎ㄍǔG袚Q到“實際事務上的同步”)。
深入理解:此行為本身并不會創(chuàng)建事務。當一個方法上標識為supports時,外部方法開啟了事務并調(diào)用此方法,那么該方法也是一個事務的方法。此時效果與reuired的一樣,一回滾都回滾。
如果外部方法沒有開啟事務,則該方法就是一個不帶事務的方法。總之一句話,這是一個萬精油式的支持。實際開發(fā)中方法是否開啟事務是一個很明確的需求,要么開啟事務,要么不使用事務,不會模棱兩可地定義既使用事務又可以不使用。
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED)
官方解釋:執(zhí)行非事務處理,如果存在的話,暫停當前事務。類似于同名的EJB事務屬性。注意:在所有事務管理器中,實際的事務暫停將不會是開箱即用的。這尤其適用于org.springframework.transaction.jta。JtaTransactionManager,它需要javax.transaction。TransactionManager將其提供給它(在標準Java EE中是特定于服務器的)。
深入理解:明確指定被標識的方法不要用事務。外部事務方法調(diào)用此方法時,事務不會進到此方法(即把外部事務掛起),直到此方法執(zhí)行完后。
NEVER(TransactionDefinition.PROPAGATION_NEVER)
官方解釋:不支持當前的事務;如果當前事務存在,則拋出異常。類似于同名的EJB事務屬性。請注意,事務同步在傳播NEVER范圍內(nèi)是不可用的。
深入理解:這個比not_supported更嚴格,如果在此方法內(nèi)部外部發(fā)現(xiàn)事務支持就拋出異常。
MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY)
官方解釋:支持當前事務;如果不存在當前事務,則拋出異常。類似于同名的EJB事務屬性。注意,傳播強制范圍內(nèi)的事務同步總是由周圍的事務驅(qū)動。
深入理解:這與never是一對反義詞。強制方法內(nèi)部或外部調(diào)用中必須要有事務,沒有就拋異常。
NESTED(TransactionDefinition.PROPAGATION_NESTED)
官方解釋:如果當前事務存在,在嵌套事務中執(zhí)行,就像需要的傳播一樣。在EJB中沒有類似的特性。注意:嵌套事務的實際創(chuàng)建只適用于特定的事務管理器。在處理JDBC 3.0驅(qū)動程序時,這只適用于JDBC DataSourceTransactionManager。一些JTA提供者也可能支持嵌套的事務。
深入理解:標識為nested的方法調(diào)用其他標有:Mandatory,supports,required的事務方法時使用的是一個事務管理,但內(nèi)部事務方法異常回滾并不會影響外部方法。
REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW)
無論如何都創(chuàng)建一個新的事務來執(zhí)行被標識的方法。一般局部數(shù)據(jù)操作一致性都用此方法。
附加貼圖:
