SpringBoot 内部方法调用,事务不起作用的原因及解决办法
2024/11/10 23:02:56
本文主要是介绍SpringBoot 内部方法调用,事务不起作用的原因及解决办法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。
我在这里模拟一个场景,大概的调用方式就如下面的代码这样。
@Override
@Transactional(rollbackFor=RuntimeException.class)
public void insertUser(User user) {
userMapper.insertUser(user);
throw new RuntimeException("");
}
/**
* 内部调用新增方法
*
* @param user
*/
@Override
public void invokeInsertUser(User user) {
this.insertUser(user);
}
AOP使用的是动态代理的机制,它会给类生成一个代理类,事务的相关操作都在代理类上完成。内部方式使用this调用方式时,使用的是实例调用,并没有通过代理类调用方法,所以会导致事务失效。
方法一 引入自身bean
在类内部通过@Autowired将本身bean引入,然后通过调用自身bean,从而实现使用AOP代理操作。
注入自身bean
@Autowired
@Lazy
private UserService service;
修改invokeInsertUser方法
/**
* 解决方法一 在bean中将自己注入进来
* @param www.91chuli.com
*/
@Override
public void invokeInsertUser(User user) {
this.service.insertUser(user);
}
方法二 通过ApplicationContext引入bean
通过ApplicationContext获取bean,通过bean调用内部方法,就使用了bean的代理类。
注入ApplicationContext
@Autowired
ApplicationContext applicationContext;
修改invokeInsertUser方法
/**
* 解决方法二 通过applicationContext获取到bean
* @param user
*/
@Override
public void invokeInsertUser(User user) {
((UserService)applicationContext.getBean("userService")).invokeInsertUser(user);
}
方法三 通过AopContext获取当前类的代理类
通过AopContext获取当前类的代理类,直接通过代理类调用方法
在引导类上添加@EnableAspectJAutoProxy(exposeProxy=true)注解
修改invokeInsertUser方法
/**
* 解决方法三 通过applicationContext获取到bean
*
* @param user
*/
@Override
public void invokeInsertUser(User user) {
((UserService) AopContext.currentProxy()).invokeInsertUser(user);
}
以上就是内部方法调用时,事务不起作用的原因及解决办法。
这篇关于SpringBoot 内部方法调用,事务不起作用的原因及解决办法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-13怎么通过 JavaScript 或其他编程语言来实现监听屏幕高度变化功能?-icode9专业技术文章分享
- 2024-11-12聊聊我们那些年用过的表达式引擎组件
- 2024-11-12让项目数据更有说服力:五款必备数据可视化管理工具推荐
- 2024-11-12人到一定年纪,要学会远离多巴胺
- 2024-11-12解读:精益生产管理的目的是什么?如何操作?
- 2024-11-12Sku预研作业
- 2024-11-12文心一言API密钥:分步申请指南
- 2024-11-12初学者指南:轻松掌握后台交互
- 2024-11-12从零开始学习:封装基础知识详解
- 2024-11-12JSON对象入门教程:轻松掌握基础用法