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

