在做业务开发时,遇到了一个事务不起作用的问题。事情是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。

场景

我在这里模拟一个场景,大概的调用方式就如下面的代码这样。

@Override@Transactional(rollbackFor = RuntimeException.class)public void insertUser(User user) {userMapper.insertUser(user);throw new RuntimeException("");}/*** 内部调用新增方法** @param user*/@Overridepublic void invokeInsertUser(User user) {this.insertUser(user);}

原因

AOP使用的是动态代理的机制,它会给类生成一个代理类,事务的相关操作都在代理类上完成。内部方式使用this调用方式时,使用的是实例调用,并没有通过代理类调用方法,所以会导致事务失效。

解决办法

方法一 引入自身bean

在类内部通过@Autowired将本身bean引入,然后通过调用自身bean,从而实现使用AOP代理操作。

注入自身bean

    @Autowired@Lazyprivate UserService service;

修改invokeInsertUser方法

    /*** 解决方法一 在bean中将自己注入进来* @param user*/@Overridepublic void invokeInsertUser(User user) {this.service.insertUser(user);}

方法二 通过ApplicationContext引入bean

通过ApplicationContext获取bean,通过bean调用内部方法,就使用了bean的代理类。

注入ApplicationContext

    @AutowiredApplicationContext applicationContext;

修改invokeInsertUser方法

    /*** 解决方法二 通过applicationContext获取到bean* @param user*/@Overridepublic void invokeInsertUser(User user) {((UserService)applicationContext.getBean("userService")).invokeInsertUser(user);}

方法三 通过AopContext获取当前类的代理类

通过AopContext获取当前类的代理类,直接通过代理类调用方法

在引导类上添加@EnableAspectJAutoProxy(exposeProxy=true)注解

修改invokeInsertUser方法

    /*** 解决方法三 通过applicationContext获取到bean** @param user*/@Overridepublic void invokeInsertUser(User user) {((UserService) AopContext.currentProxy()).invokeInsertUser(user);}

以上就是内部方法调用时,事务不起作用的原因及解决办法。

如果您发现文中错误,还请多多指教。欢迎关注个人公众号,一起交流学习。

最后

打个小广告,金九银十跳槽季,平头哥给大家整理了一份较全面的 Java 学习资料,欢迎扫码关注微信公众号:「平头哥的技术博文」领取,祝各位升职加薪。

内部方法调用,事务不起作用的原因及解决办法相关推荐

  1. springboot 调用方法事物_SpringBoot 内部方法调用,事务不起作用的原因及解决办法...

    在做业务开发时,遇到了一个事务不起作用的问题.大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚.查阅资料后,问题得到解决,记录下来分享给大家. 场景 我在这里模拟一个场景 ...

  2. php iframe js加载不上,js iframe的onload事件不去作用的原因及解决办法

    通过createElement_x_x创建的iframe的onload事件在有些时候不响应,具体原因和解决办法如下. 首先,我们来看一下下面这种方法: function createFrame(){ ...

  3. jquery 异步调用方法中不能给全局变量赋值的原因及解决办法

    在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们发现程序执行完后并没有获取到我们想要的值,这时很有可能是因为你用的是ajax的异步调用async:t ...

  4. Git忽略文件不起作用的原因及解决办法

    出现问题: 你们有没有在使用git的时候会遇到这种情况.在开发过程中,我们会在 .gitignore 文件中添加一些忽略项,然而当我们push到远程的时候会出现一个问题,那就是我们在 .gitigno ...

  5. SQL Server中事务日志已满的原因以及解决办法

    错误描述:数据库的事务日志已满.若要查明无法重用日志中的空间的原因 ,请参阅sys.databases 中的 log_reuse_wait_desc 列 . 首先引入一下事务日志的概念(来自百度百科) ...

  6. wpsup计算机内存不足处理方法,wps office显示空间不足的原因及解决办法

    我们在操作win10系统电脑的时候,常常会遇到win10系统打开wps office显示空间不足的情况,想必大家都遇到过win10系统打开wps office显示空间不足的情况吧,那么应该怎么处理wi ...

  7. 计算机开机慢的原因及解决方法,计算机开机慢的某些主要原因及解决办法

    原标题: 计算机开机慢的某些主要原因及解决办法 令计算机慢的主因: 1.在开机时加载太多程序 2.桌面上开启桌布 3.没有定期清理硬磁盘和重组硬盘 4.机子的配置和你所装的系统兼容性不是很好,导致程序 ...

  8. Windows下cmd中cd命令不起作用的原因和解决办法

    问题如图: 即便是输入了cd指令,但是并没有跳转. 原因: 实际上cmd换目录跨磁盘的话需要先进行磁盘的转换. 解决办法: 先输入: D: 进行磁盘转换 然后cd到对应目录下即可:

  9. 在事务方法中调用另外一个事务方法,被调用方法的事务没起作用

    在事务方法中调用另外一个事务方法,被调用方法的事务没起作用 在事务方法中调用另外一个事务方法,被调用方法的事务没起作用 问题描述:(例) service层有两个事务方法insertUser1.inse ...

最新文章

  1. java当前路径和相对路径相关的疑惑
  2. docker私有仓库harbor配置helm chart仓库(安装helm chart插件)
  3. 获取本机IP_考虑多网卡的情况
  4. ComponentBase.createMetaData and manifest.json oRoute
  5. c语言 字符串 url,如何对URL字符串进行百分号编码
  6. Kubernetes集群(概念篇)
  7. plt.axis()用法详解
  8. 华为云数据库携新品惊艳亮相2019华为全联接大会
  9. 13 个开源备份解决方案
  10. [OC]TableView使用
  11. 2022年引领全球增长的60大技术:机会、增长、投资、洞察
  12. 20151209小问题
  13. python通过什么对象连接数据库_介绍Python 数据库的Connection、Cursor两大对象
  14. C语言实现飞机订票系统
  15. delphi 发送html邮件,delphi 发邮件 Delphi发送邮件的源码
  16. 数据压缩算法该如何选择?
  17. 开发支付宝接口时的错误报告:openssl_sign(): supplied key param cannot be coerced into a private key【解决方法】
  18. 中山西路620号 的人才服务中心搬到 梅园路77号去了
  19. Creo8.0将默认单位永久设置为公制毫米的方法
  20. 一文看懂WebRTC媒体服务器

热门文章

  1. 公积金房贷计算器最新2014
  2. shoeBox超实用的雪碧图(Sprite)图制作工具-使用shoeBox
  3. 如何通过ip追踪对方的虚拟地址
  4. index.php模版,稻壳CMS模板教程-第五节 给首页模板index.php添加站点名和搜索代码...
  5. jQuery.ui.1.7.2--Datepicker中文文档
  6. shell if else 语句 写成一行
  7. 逻辑漏洞---登录验证码安全
  8. 制造执行系统MES现状及发展趋势探讨
  9. SaaSpace:6款最好的免费播客录制与编辑软件工具
  10. Q1业绩成长超预期,没了左晖的贝壳未来谁能掌舵?