Spring事務(二)-事務傳播行為 在Spring里,一個事務方法被另外一個事務方法調用時,兩個方法的事務應該如何進行,說白話一點,就是說當出現異常需要回滾時,各個方法的數據操作是否要全部回滾,事務傳播行為就是決定了這樣的一個處理結果。A事務方法(外部方法)調用了B事務方法(內部方法,又叫被調用方 ...
Spring事務(二)-事務傳播行為
在Spring里,一個事務方法被另外一個事務方法調用時,兩個方法的事務應該如何進行,說白話一點,就是說當出現異常需要回滾時,各個方法的數據操作是否要全部回滾,事務傳播行為就是決定了這樣的一個處理結果。A事務方法(外部方法)調用了B事務方法(內部方法,又叫被調用方法),B是繼續在A的事務中運行呢?還是為自己另開一個新事務運行呢?這就是由B的事務傳播行為決定的。
@Transactional註解通過propagation屬性設置事務事務傳播行為,如下:
@Transactional(propagation = Propagation.REQUIRED)
public void method(){}
Spring的事務傳播行為一共有7種:
1、REQUIRED
這是預設傳播行為。如果當前沒有事務,就新建一個事務。如果當前已經存在事務,就加入到這個事務中。這個當前事務指的是外部方法本身的事務。
2、REQUIRES_NEW
開啟一個新的事務。如果當前已經存在事務,則先將這個存在的事務掛起。( 當類A中的 a 方法用預設Propagation.REQUIRED模式,類B中的 b方法加上採用 Propagation.REQUIRES_NEW模式,然後在 a 方法中調用 b方法操作資料庫,然而 a方法拋出異常後,b方法並沒有進行回滾,因為Propagation.REQUIRES_NEW會暫停 a方法的事務。 )
3、SUPPORTS
如果當前存在一個事務,就加入到這個事務中。如果當前沒有事務,則非事務方式執行。
4、MANDATORY
如果當前存在一個事務,就加入到這個事務中。如果當前沒有開啟事務,則拋出異常。
5、NOT_SUPPORTED
總是非事務方式執行,並掛起任何存在的事務。
6、NEVER
非事務方式運行,當前存在事務拋出異常。
7、NESTED
如果當前存在一個事務,則運行在一個嵌套的事務中。 如果當前沒有開啟事務, 則按 REQUIRED 屬性執行。這裡所說的“運行在一個嵌套的事務中”,其實就是說運行在外層事務的子事務中,這個子事務有單獨的保存點,因此,當內部方法拋異常時,不會影響到外部方法的事務,也就是說,外部方法的數據操作仍然可以提交。