天天看點

@Transactional注解中事務的傳播行為總結

@Transactional注解中事務的傳播行為總結

在事務的注解@Transactional中的propagation字段定義了事務的傳播行為

@Transactional注解中事務的傳播行為總結

當事務方法被另一個事務方法調用時,必須指定事務應該如何傳播。例如:方法可能繼續在現有事務中運作,也可能開啟一個新事務,并在自己的事務中運作。

事務的傳播行為可以由傳播屬性指定。Spring定義了7種類傳播行為。

@Transactional注解中事務的傳播行為總結
@Transactional
    public void mulTx() {//這個事務嵌套了兩個小事務
        
        bookService.check("Tom", "ISBN-001");
        
        bookService.updatePrice("ISBN-002", 998);
        
        
    }
           

對于上圖,這三個方法都是通過注解的聲明式事務。如果把内部兩個事務的propagation字段的值設定為REQUIRED,那麼他們會在mulTx的内部運作,當某一個事務異常,則整體復原

此時,如果将updatePrice的propagation字段設定為REQUIRES_NEW,那麼updatePrice會自己建立新的事務,check和mulTx則是綁定在一起的,如果updatePrice出錯復原,雖然他建立了新的事務,但是他将異常抛出,mulTx接收到這個異常,依舊會復原。

如果将上面的方法的propagation字段設定為REQUIRES_NEW,當下面的方法出現異常,會復原,但是上面的方法建立了自己的事務,在開啟自己的事務之前将mulTx事務挂起,并且在下面的事務開啟之前已經送出,資料庫内容已經被修改,故不會受到影響

@Transactional注解中事務的傳播行為總結