目錄
Spring 的不同事務傳播行為
PROPAGATION_REQUIRES_NEW事務傳播行為什么情況下會使用?
一、PROPAGATION_REQUIRES_NEW的含義
二、使用場景
三、注意事項
PROPAGATION_NESTED事務傳播行為什么情況下會使用?
一、PROPAGATION_NESTED的含義
二、使用場景
三、嵌套事務的特點
四、注意事項
Spring 的不同事務傳播行為
- 事務傳播行為(propagation behavior)指的就是當一個事務方法被另一個事務方法調用時,這個事務方法應該如何進行。
1 @Transactional(propagation = Propagation.REQUIRES_NEW)
2 public void methodB() {
- PROPAGATION_REQUIRED:如果存在一個事務,則支持當前事務。如果沒有事務則開啟一個新的事務。
- PROPAGATION SUPPORTS:如果存在一個事務,支持當前事務各。如果沒有事務,則非事務的執行。但是對于事務同步的事務管理器 。PROPAGATION_SUPPORTS與不使用事務有少許不同。
- PROPAGATION_MANDATORY:如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。
- PROPAGATION_REQUIRES_NEW:需要使用JTATransactionManager作為事務管理器,它會開啟一個新的事務。如果一個事務已經存在,則先將這個存在的事務掛起。
- PROPAGATION_NOT_SUPPORTED:總是非事務地執行,并并掛起任何存在的事務。也需要使用JTATransactionManager作為事務管理器
- PROPAGATION_NEVER:總是非事務地執行,如果存在一個活動事務,則拋出異常。
- PROPAGATION_NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中。如果沒有活動事務,則按REQUIRED屬性執行,
【PROPAGATION_NESTED與PROPAGATION_REQUIRES_NEW的區別】:它們非常類似,都像一個嵌套事務,如果不存在一個活動的事務,都會開啟個新的事務。
- 使用PROPAGATION_REQUIRES_NEW時,內層事務與外層事務就像兩個獨工立的事務一樣,一旦內層事務進行了提交后,外層事務不能對其進行回滾。兩個事務互不影響。兩個事務不是一個真正的嵌套事務。同時它需要JTA事務管理器的支持。
- 使用PROPAGATION_NESTED時,外層事務的回滾可以引起內層事務的回滾。而內層事務的異常并不會導致外層事務的回滾,它是一個真正的嵌套事務。DataSourceTransactionManager使用savepoint支持PROPAGATION_NESTED時,需要JDBC3.0以上驅動及1.4以上的JDK版本支持。其它的JTATrasactionManager實現可能有不同的支持方式。
- PROPAGATION REQUIRES NEW 啟動一個新的,不依賴于環境的勺"內部"事務。這個事務將被完全commited或rolled back而不依賴于外部事務,它擁有自己的隔離范圍,自己的鎖等等。當內部事務開始執行時,外部事務將被掛起,內部事務結束時,外部事務將繼續執行。另一方面i, PROPAGATION NESTED 開始一個"嵌套的"事務,它是已經存在事務的一個真正的子事務。嵌套事務開始執行時,它將取得一個savepoint。如果這個嵌套事務失敗,我們將回滾到此savepoint。嵌套事務是外部事務的一部分,只有外部事務結束后它才會被提交。
- 由此可見 PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NEESTED的最大區別在于,PROPAGATION_REQUIRES_NEW完全是一個新的事務,而PROPAGATION_NEST