Spring事務嵌套:業務場景事務2異常時需要事務2回滾事務1提交

目錄

1、改變事務2的傳播方式REQUIRES_NEW

 

2、異步調用


業務場景:

業務提交審覈(生成審覈賬單等數據,事務方法1),審覈通過(業務看到賬單如果沒有問題就去手動審覈通過,事務方法2),

後期增加了一個自動審覈的功能,如果賬單中等等一些信息匹配時就直接審覈通過,此時,最理想的改動就是中間加個方法,提交審覈完成後去主動判斷是否能走自動審覈通過,也就是事務方法1調用事務方法2,出現了事務回滾不是理想結果的情況,當2出現異常時,提交審覈也會被回滾。

事務不生效問題可見:事務不生效

 

現要實現當事務方法2出現異常時,事務方法1正常提交,事務方法2回滾

1、改變事務2的傳播方式REQUIRES_NEW

嵌套事務:就是事務方法A調用事務方法B,外層調用方法內層被調用方法都是事務方法的情況。

一般我們不關心外層調用方法的事務傳播行爲(用默認的(不指定就行))。而只關心內層被調用方法的傳播行爲。

我們一般情況下,會有以下三種需求:

  1. 外層調用方法和內層被調用方法,有異常一起回滾,沒問題一起提交。(共用一個事務)
  2. 內層被調用方法回滾與否,不會影響外層調用方法。而外層調用方法出異常回滾,也不會回滾內層被調用方法(兩個獨立的事務)
  3. 內層被調用方法回滾與否,不會影響外層調用方法。而外層調用方法出異常回滾,也會回滾內層被調用方法(嵌套事務)

這三種情況正好對應三種最常用的傳播行爲

1----->@Transactional(propagation=Propagation.REQUIRED) :

內外層方法共用外層方法的事務

2----->@Transactional(propagation=Propagation.REQUIRES_NEW) :

當執行內層被調用方法時,外層方法的事務會掛起。兩個事務相互獨立,不會相互影響。

3----->@Transactional(propagation=Propagation.NESTED) :

理解Nested的關鍵是savepoint。他與PROPAGATION_REQUIRES_NEW的區別是,PROPAGATION_REQUIRES_NEW另起一個事務,將會與他的父事務相互獨立,
而Nested的事務和他的父事務是相依的,他的提交是要等和他的父事務一塊提交的。也就是說,如果父事務最後回滾,他也要回滾的。

結果:改變事務傳播方式爲ROPAGATION_REQUIRES_NEW,報錯,因爲事務方法2要用到事務方法1的數據,若不在一個事務,就找不到數據會報錯

所以,怎樣能讓事務方法1與事務方法2無關聯,事務方法1調用完事務方法2後就提交,或者說此處就不應該出現事務嵌套

 

2、異步調用

目前使用的是異步調用解決了當前的問題:一個可以無需等待被調用函數的返回值就讓操作繼續進行的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章