Spring的嵌套事務(Propagation.NESTED)到底是個啥案例代碼講解

什麼是嵌套事務

嵌套事務其實是對數據庫SavePoint概念的Java操作版封裝,什麼是SavePoint參考我另一篇文章:https://www.jb51.net/article/272004.htm

SavePoint是數據庫事務中的一個概念, 可以將整個事務切割為不同的小事務, 可以選擇將狀態回滾到某個小事務發生時的樣子。

Propagation.NESTED 則是外部事務的子事務, 如果外部事務 commit, 嵌套事務也會被 commit, 這個規則同樣適用於rollback.

嵌套事務開始執行時,  它將取得一個 savepoint, 如果這個嵌套事務失敗, 我們將回滾到此 savepoint,嵌套事務是外部事務的一部分, 隻有外部事務結束後它才會被提交.

案例

偽代碼如下:

ServiceA {  
      
    /** 
     * 事務屬性配置為 PROPAGATION_REQUIRED 
     */  
    void methodA() {  
        try {
          DML......
          ServiceB.methodB();  
        } catch(...) ...
        DML....
    }  
  
}  
  
ServiceB {  
      
    /** 
     * 事務屬性配置為 PROPAGATION_NESTED 
     */   
    void methodB() {  
    }  
     
}     

如上代碼,當methodB開始執行時,spring會在數據庫中生成一個SavePoint,methodB失敗被spring捕捉到時,會回滾該SavePoint,將methodB中對數據庫的操作全部回滾到SavePoint之前,

註意methodA中加入瞭try catch,引入你的代碼如果希望methodB作為一個局部性的事務拋出異常失敗後,不影響A的外圍事務,那麼就不能讓異常繼續往上拋,否則A這個外圍事務也會被全部回滾,因此要在A中自行消化這個異常,

說到這裡其實可以總結一下,嵌套事務就是spring像對正常事務一樣,幫助我們捕捉SavePoint小事務的異常並進行自動回滾,免去我們在Java代碼中使用SavePoint時想要回滾的手動操作,隻是前者是一個正常的大事務回滾,後者是大事務中的小事務回滾。

下面是實際測試代碼,我們在保存key的時候,也保存一個value,但是保存value時我們拋出exception,並且在保存key的地方catch住:

image.png

image.png

這裡是保存前的db,都是空表:

image.png

image.png

操作後,可以看到key表保存進去,value表沒保存進去:

image.png

image.png

這裡有人會說,key表保存進去是因為我們自己吃瞭異常,沒有被spring捕獲到,事務提交瞭,所以key表保存進去瞭,value表隻是因為被spring捕獲到瞭而已,是不是和嵌套事務沒關系?那我們改一下value的事務行為,也使用默認方式,代碼如下,並且我們把上面保存進db的數據清空,方便查看效果:

image.png

執行後查看數據庫, 空空如也:

image.png

image.png

我們再看log,spring出瞭一個 Transaction rolled back because it has been marked as rollback-only 的錯誤,這是什麼原因呢? 更改瞭事務行為後就出現這種,

其實原因很簡單,因為兩個service都是用默認行為,那麼他們同屬一個事務,spring檢測到瞭value的方法發生瞭錯誤後,會將事務標記為 rollback-only,意味著本次事務發生瞭錯誤必須回滾,後續如果嘗試提交此事務,就會提示下面的錯誤信息,

但是我們上面使用嵌套事務時,並沒有發生這種情況,因為保存value時,創建瞭一個SavePoint,spring捕捉到錯誤後回滾這個SavePoint,並不會將事務標記為錯誤回滾,後續key地方catch瞭這個錯誤,是可以正常提交此事務的。

image.png

SavePoint和嵌套事務在實際應用中場景不多,瞭解一下如果將來真有需要的話 可以派上用場。

這裡有篇文章講解使用@Transactional 設置嵌套事務不回滾。

到此這篇關於Spring的嵌套事務(Propagation.NESTED)到底是個啥案例代碼講解的文章就介紹到這瞭,更多相關Spring嵌套事務內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: