SpringBoot內(nèi)部調(diào)用事務(wù)不起作用問題的解決方案
在做業(yè)務(wù)開發(fā)時,遇到了一個事務(wù)不起作用的問題。大概流程是這樣的,方法內(nèi)部的定時任務(wù)調(diào)用了一個帶事務(wù)的方法,失敗后事務(wù)沒有回滾。查閱資料后,問題得到解決,記錄下來分享給大家。
場景
我在這里模擬一個場景,大概的調(diào)用方式就如下面的代碼這樣。
@Override @Transactional(rollbackFor = RuntimeException.class) public void insertUser(User user) { userMapper.insertUser(user); throw new RuntimeException(""); } /** * 內(nèi)部調(diào)用新增方法 * * @param user */ @Override public void invokeInsertUser(User user) { this.insertUser(user); }
原因
AOP使用的是動態(tài)代理的機制,它會給類生成一個代理類,事務(wù)的相關(guān)操作都在代理類上完成。內(nèi)部方式使用this調(diào)用方式時,使用的是實例調(diào)用,并沒有通過代理類調(diào)用方法,所以會導(dǎo)致事務(wù)失效。
解決辦法
方法一 引入自身bean
在類內(nèi)部通過@Autowired
將本身bean
引入,然后通過調(diào)用自身bean
,從而實現(xiàn)使用AOP
代理操作。
注入自身bean
@Autowired @Lazy private UserService service;
修改invokeInsertUser
方法
/** * 解決方法一 在bean中將自己注入進來 * @param user */ @Override public void invokeInsertUser(User user) { this.service.insertUser(user); }
方法二 通過ApplicationContext引入bean
通過ApplicationContext
獲取bean,通過bean調(diào)用內(nèi)部方法,就使用了bean的代理類。
注入ApplicationContext
@Autowired ApplicationContext applicationContext;
修改invokeInsertUser
方法
/** * 解決方法二 通過applicationContext獲取到bean * @param user */ @Override public void invokeInsertUser(User user) { ((UserService)applicationContext.getBean("userService")).invokeInsertUser(user); }
方法三 通過AopContext獲取當(dāng)前類的代理類
通過AopContext
獲取當(dāng)前類的代理類,直接通過代理類調(diào)用方法
在引導(dǎo)類上添加@EnableAspectJAutoProxy(exposeProxy=true)
注解
修改invokeInsertUser
方法
/** * 解決方法三 通過applicationContext獲取到bean * * @param user */ @Override public void invokeInsertUser(User user) { ((UserService) AopContext.currentProxy()).invokeInsertUser(user); }
以上就是內(nèi)部方法調(diào)用時,事務(wù)不起作用的原因及解決辦法。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringMVC中事務(wù)是否可以加在Controller層的問題
- Spring事務(wù)失效的一種原因關(guān)于this調(diào)用的問題
- JAVA Spring中讓人頭痛的JAVA大事務(wù)問題要如何解決你知道嗎
- 解決Spring或SpringBoot開啟事務(wù)以后無法返回自增主鍵的問題
- 解決try-catch捕獲異常信息后Spring事務(wù)失效的問題
- Spring事務(wù)失效問題分析及解決方案
- 詳解Spring Boot微服務(wù)如何集成fescar解決分布式事務(wù)問題
- Spring聲明式事務(wù)和@Aspect的攔截順序問題的解決
- 解決spring mvc 多數(shù)據(jù)源切換,不支持事務(wù)控制的問題
- Spring中事務(wù)幾個常見的問題解決
相關(guān)文章
解決SpringMVC @RequestMapping不設(shè)置value出現(xiàn)的問題
這篇文章主要介紹了解決SpringMVC @RequestMapping不設(shè)置value出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java語言Consistent Hash算法學(xué)習(xí)筆記(代碼示例)
這篇文章主要介紹了Java語言Consistent Hash算法學(xué)習(xí)筆記(代碼示例),分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02Java中的FilterOutputStream 簡介_動力節(jié)點Java學(xué)院整理
FilterOutputStream 的作用是用來“封裝其它的輸出流,并為它們提供額外的功能”。它主要包括BufferedOutputStream, DataOutputStream和PrintStream。接下來通過本文給大家簡單介紹下FilterOutputStream知識,需要的朋友參考下吧2017-05-05詳解JAVA生成將圖片存入數(shù)據(jù)庫的sql語句實現(xiàn)方法
這篇文章主要介紹了詳解JAVA生成將圖片存入數(shù)據(jù)庫的sql語句實現(xiàn)方法的相關(guān)資料,這里就是實現(xiàn)java生成圖片并存入數(shù)據(jù)庫的實例,需要的朋友可以參考下2017-08-08java大數(shù)乘法的簡單實現(xiàn) 浮點數(shù)乘法運算
大數(shù)乘法可以進行任意大小和精度的整數(shù)和浮點數(shù)的乘法運算, 精確度很高, 可以用作經(jīng)融等領(lǐng)域的計算,這個是我看了一些資料, 然后自己整理實現(xiàn)的,簡單測試了一下2014-01-01SpringBoot整合Mybatis無法掃描xml文件的解決
這篇文章主要介紹了SpringBoot整合Mybatis無法掃描xml文件的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12Java實現(xiàn)的文件上傳下載工具類完整實例【上傳文件自動命名】
這篇文章主要介紹了Java實現(xiàn)的文件上傳下載工具類,結(jié)合完整實例形式分析了java針對文件上傳下載操作的相關(guān)實現(xiàn)技巧,并且針對上傳文件提供了自動命名功能以避免文件命名重復(fù),需要的朋友可以參考下2017-11-11