springBoot註解事務失效分析總結

2021-09-28 21:47:48 字數 1525 閱讀 5272

一 問題背景

前段時間在專案中使用到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...