本文基於mysql做測試
使用聲明式事務的注解@Transactional,可以完成事務的添加。
事務的傳播范圍
Propagation屬性用來枚舉事務的傳播行為。所謂事務傳播行為就是多個事務方法相互調用時,事務如何在這些方法間傳播。Spring支持7種事務傳播行為,默認為REQUIRED。
//默認使用,同一個方法中使用dml操作,這兩個dml操作,要么都成功,要么都失敗。
REQUIRED(0),
//
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3),
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);
1、REQUIRED
REQUIRED是常用的事務傳播行為,如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。
2、SUPPORTS
SUPPORTS表示當前方法不需要事務上下文,但是如果存在當前事務的話,那么這個方法會在這個事務中運行。
3、MANDATORY
MANDATORY表示該方法必須在事務中運行,如果當前事務不存在,則會拋出一個異常。不會主動開啟一個事務。
4、REQUIRES_NEW
REQUIRES_NEW表示當前方法必須運行在它自己的事務中。一個新的事務將被啟動,如果存在當前事務,在該方法執行期間,當前事務會被掛起(如果一個事務已經存在,則先將這個存在的事務掛起)。如果使用JTATransactionManager的話,則需要訪問TransactionManager。
5、NOT_SUPPORTED
NOT_SUPPORTED表示該方法不應該運行在事務中,如果存在當前事務,在該方法運行期間,當前事務將被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager。
6、NEVER
NEVER表示當前方法不應該運行在事務上下文中,如果當前正有一個事務在運行,則會拋出異常。
7、NESTED
NESTED表示如果當前已經存在一個事務,那么該方法將會在嵌套事務中運行。嵌套的事務可以獨立於當前事務進行單獨地提交或回滾。如果當前事務不存在,那么其行為與REQUIRED一樣。嵌套事務一個非常重要的概念就是內層事務依賴於外層事務。外層事務失敗時,會回滾內層事務所做的動作。而內層事務操作失敗並不會引起外層事務的回滾。
綜上所述,NESTED和REQUIRES_NEW非常相似,都是開啟一個屬於它自己的新事務。使用REQUIRES_NEW時,內層事務與外層事務就像兩個獨立的事務一樣,一旦內層事務進行了提交后,外層事務不能對其進行回滾。當內部事務開始執行時, 外部事務將被掛起, 內務事務結束時, 外部事務將繼續執行。兩個事務互不影響,兩個事務不是一個真正的嵌套事務,同時它還需要JTA事務管理器的支持。
使用NESTED時,外層事務的回滾可以引起內層事務的回滾。而內層事務的異常並不會導致外層事務的回滾,它是一個真正的嵌套事務。嵌套事務開始執行時, 它將取得一個 savepoint,如果這個嵌套事務失敗, 將回滾到此savepoint。潛套事務是外部事務的一部分, 只有外部事務結束后它才會被提交。