這幾天在寫專案的時候遇到了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...