當事務A被事務B調用時,必須得指定事務的傳播行爲。java
事務的傳播行爲有7種,分別爲REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTEDsql
若是A方法和B方法的關係時這樣子的spa
若是A調用B,那麼B和A走的同一個事務;3d
若是A沒有加事務,那麼B就會從新new一個事務;orm
2.SUPPORTSblog
若是A有事務,那麼B會和A共用一個事務;事務
若是A沒有事務,那麼B也不會有事務。it
3.MANDATORYio
若是A有事務,那麼B會和A用一個事務;form
若是A沒有事務,那麼B會跑出異常,也就是B若是這樣配了必須得加入有事務的方法。
4.REQUIRES_NEW
這樣寫的話,執行B時將會把A事務掛起,B事務提交後才能提交A事務,能夠這麼說,這兩個事務是相互獨立的。
5.NOT_SUPPORTED
若是事務B被賦予NOT_SUPPORTED,那麼事務B不管如何都不支持事務,而且掛起全部事務。
6.NEVER
老是非事務地執行,若是寫成上圖這樣,它會拋異常,由於它存在事務。
7.NESTED
若是一個活動的事務存在,則運行在一個嵌套的事務中. 若是沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行。這是一個嵌套事務,使用JDBC 3.0驅動時,僅僅支持DataSourceTransactionManager做爲事務管理器。須要JDBC 驅動的java.sql.Savepoint類。有一些JTA的事務管理器實現可能也提供了一樣的功能。使用PROPAGATION_NESTED,還須要把PlatformTransactionManager的nestedTransactionAllowed屬性設爲true;而 nestedTransactionAllowed屬性值默認爲false。
外層事務的回滾能夠引發內層事務的回滾。而內層事務的異常並不會致使外層事務的回滾,它是一個真正的嵌套事務