Spring boot事務失效的幾種情況

2021-10-23 15:47:18 字數 1501 閱讀 4267

這幾天在寫專案的時候遇到了spring boot中事務失效的情況,這裡做一下記錄,後面遇到了其他情況再繼續更新。

使用乙個沒有事務的方法呼叫乙個有事務的方法,失敗後不會進行回滾:

@transactional

public

intupdate

(admin admin)

public

intinvokeupdate

(admin admin)

這時因為spring aop預設使用動態**,會給被**的類生成乙個**類,事務相關的操作都通過**來完成,使用內部方法呼叫時,使用的是例項呼叫,沒有通過**類呼叫方法,因此事務不會檢測到失敗。

解決方法就是使用**類呼叫事務方法:

在類內部注入本類

@autowired

private adminservice service;

// 然後再呼叫

public

intinvokeupdate

(admin admin)

(

getbean

("adminservice"))

.invokeupdate

(admin admin)

;

通過aopcontext引入

(

(adminservice)aopcontext.

currentproxy()

).invokeupdate

(admin admin)

;

@transactional只會監聽runtimeexception,當丟擲其他異常時,不能正常捕獲,也就不會回滾。

解決方法:

手動捕獲異常,然後包裝為runtimeexception丟擲

使用roobackfor屬性指定需要捕獲的異常:

@transactional

(rollbackfor = exception.

class

)public

intupdate

(admin admin)

原始碼:org.springframework.transaction.interceptor.transactionaspectsupport#invokewithintransaction

關鍵部分:

try

catch

(throwable var13)

throw

newtransactionaspectsupport.throwableholderexception

(var13);}

throwableholder.throwable = var13;

var9 = null;

}finally

spring boot事務失效,不生效

springboot專案中開啟事務 1 啟動類上加開啟事務的註解,2 在需要事務控制的方法上加上事務註解就可以了生效了 本次事務不生效是因為專案中使用了shrio作為安全認證框架,在shiro中使用到的service介面被提前例項化。沒有生成 物件。正常是service介面如果配置了事務註解。是由s...

springBoot註解事務失效分析總結

一 問題背景 前段時間在專案中使用到spring事務註解功能,在自測 時發現異常下未能產生回滾操作,藉此空閒將之前問題定位思路整理如下,希望對大家定位該類問題提供解決思路。二 分析與解決 本次測試工程採用springboot mybits mysql進行驗證,在controller中注入servic...

spring事務失效

遇到的問題 前端時間我在做乙個父子事務巢狀的時候,出現了子事務失效。在同類的子事務上加事務註解一直都不能建立事務,後來發現是子事務失效了。下面總結一下事務失效情況和解決經驗 事務失效有如下幾種情況 沒有transaction註解 事務沒有丟擲runtimeexception異常到方法上 方法內丟擲r...