一 問題背景
前段時間在專案中使用到spring事務註解功能,在自測**時發現異常下未能產生回滾操作,藉此空閒將之前問題定位思路整理如下,希望對大家定位該類問題提供解決思路。
二 分析與解決
本次測試工程採用springboot+mybits+mysql進行驗證,在controller中注入service呼叫service的實現類進行事務操作,專案結構如下圖所示
1. 內部呼叫導致事務失效
導致該問題原因為spring執行方法update的時候會生成乙個動態**類去執行**類的該方法,**類在執行updateuser時,執行的是當前例項的updateuser方法不會通過動態**去進行事務增強處理所以會導致事務消除。
解決此問題需要在當前類中注入當前類的例項bean,通過當前類的例項去呼叫事務增強的updateuser方法,或者直接將事務新增至update方法,如下圖所示:
將事務新增至直接呼叫方法
注入當前類例項
2. 異常捕獲導致事務失效
(1)自動回滾
需要在異常處理中丟擲事務所對應的異常,事務處理的異常預設為runtimeexception
(2)手動回滾
需要在異常處理中手動進行異常回滾操作,如下圖所示
(3)回滾部分異常
3. 方法許可權限制引起失效
spring的事務註解@transactional只能放在public修飾的方法上才起作用,如果放在其他非public(private,protected)方法上,雖然不報錯,但是事務不起作用
三參考資料
spring事務失效的幾種原因
springboot2異常處理之用try/catch錯誤資訊並回滾事務(自動回滾/手動回滾/部分回滾)
SPRING註解事務管理
quote 大家在使用spring的註解式事務管理時,對事務的傳播行為和隔離級別可能有點不知所措,下邊就詳細的介紹下以備方便查閱。事物註解方式 transactional 當標於類前時,標示類中所有方法都進行事物處理 例子 transactional public class testservice...
spring註解事務傳播行為
在 service 類前加上 transactional 宣告這個 service 所有方法需要事務管理。每乙個業務方法開始時都會開啟乙個事務。spring 預設情況下會對執行期例外 runtimeexception 進行事務回滾。這個例外是 unchecked 如果遇到 checked 意外就不回...
Transactional註解事務不生效問題
spring 事務配置 事務配置 transactionmanager class org.springframework.jdbc.datasource.datasourcetransactionmanager datasource ref shardingdatasource transacti...