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

场景

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

@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 user

*/

@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);

}

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

最后

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

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

jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法   在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...

spring声明式事务 同一类内方法调用事务失效

只要避开Spring目前的AOP实现上的限制,要么都声明要事务,要么分开成两个类,要么直接在方法里使用编程式事务 [问题] Spring的声明式事务,我想就不用多介绍了吧,一句话“自从用了Spring ...

spring声明式事务 同一类内方法调用事务失效(转)

原文 https://blog.csdn.net/jiesa/article/details/53438342 [问题] Spring的声明式事务,我想就不用多介绍了吧,一句话“自从用了Spring ...

Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)

Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效) 前言 今天在使用Spring cache的Cacheable注解的过程中遇见了一个Cacheable注解失效的问题, ...

C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法

原文:C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法 本人新手,在.Net中写WebAPI的时候,当接口返回的json数据含有日期时间类型的字段时, ...

Spring AOP无法拦截内部方法调用

当在同一个类中,A方法调用B方法时,AOP无法工作的问题 假设一个接口里面有两个方法: package demo.long; public interface CustomerService { pu ...

Spring 内部方法调用失效问题(AOP)

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

AOP方法增强自身内部方法调用无效 SpringCache 例子

开启注解@EnableCaChing,配置CacheManager,结合注解@Cacheable,@CacheEvit,@CachePut对数据进行缓存操作 缺点:内部调用,非Public方法上使用注 ...

随机推荐

python操作数据库

一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可. Linux 下的安装可能会更加简单,除了下载安装包进行安装外,一般的l ...

iOS 页面间传值 之 属性传值,代理传值

手机 APP 运行,不同页面间传值是必不可少,传值的方式有很多(方法传值,属性传值,代理传值,单例传值) ,这里主要总结下属性传值和代理传值. 属性传值:属性传值是最简单,也是最常见的一种传值方式,但 ...

POJ3169 Layout(差分约束系统)

POJ3169 Layout 题意: n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0.这些牛的距离存在着一些约束关系:1.有ml组(u, v, w)的约束关系,表示牛 ...

JS 与 OC

做项目需要从网页点击跳转到app的一个页面上,并且需要获取参数. 当时后台给写的参数是这样的.自己打开浏览器看的源码 JavaScript:window.location.href=   这句话在js ...

Vue 爬坑之路(八)—— 使用 Echarts 创建图表

在后台管理系统中,图表是一个很普遍的元素.目前常用的图标插件有 charts,  Echarts, highcharts.这次将介绍 Echarts 在 Vue 项目中的应用. 一.安装插件 使用 c ...

[Swift]LeetCode630. 课程表 III | Course Schedule III

There are n different online courses numbered from 1 to n. Each course has some duration(course leng ...

Java 多线程(一)—— 概念的引入

并发和并行 并行:指两个或多个时间在同一时刻发生(同时发生): 并发:指两个或多个事件在一个时间段内发生. 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 C ...

HDU 2511 汉诺塔X

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2511 1,2,...,n表示n个盘子.数字大盘子就大.n个盘子放在第1根柱子上.大盘不能放在小盘上.在 ...

C语言-删除注释

C语言中的注释,不嵌套,一律使用/*   */的形式.不过双引号中的/*  */则不能算是注释. 以下是正确的代码 /* * ===================================== ...

Java中的static关键字的用法

1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法. (2 ...

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

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

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

  2. cad2014卡顿的解决方法_AutoCAD 2012运行卡顿怎么办 cad卡顿的原因和解决办法

    随着AutoCAD版本的更新,AutoCAD运行时也出现了卡顿的情况.刚刚学习AutoCAD的时候,安装了AutoCAD2008版本,这个版本运行流畅安装了autocad2012版本,结果发现2G内存 ...

  3. Springboot中手动new的对象无法注入交给Spring容器管理的原因及解决办法

    Springboot中Bean的注入 我们都知道,Springboot可以使用方法级别注解(@Bean)和类级别注解(@Controller.@Component.@Service等)加包扫描的方式注 ...

  4. php垂直对齐,CSS垂直对齐不起作用的原因及解决方法

    verticla-align用于调整内联元素的垂直位置,但是有时候它不起作用,本篇文章将来给大家分享关于CSS垂直对齐不起作用的原因和解决方法. 我们先来分析一下导致垂直对齐无效的原因 我想很多人都会 ...

  5. 计算机蓝屏的原因及解决方法,电脑启动就蓝屏怎么回事 电脑蓝屏的原因与解决办法...

    电脑在使用的时候出现蓝屏,这个时候一定要先找到原因,因为引起电脑蓝屏的原因还是比较多,如果找到原因才知道使用哪种解决方法比较好.下面小编就来给大家介绍一下电脑启动就蓝屏怎么回事及电脑蓝屏的原因与解决办 ...

  6. 排查IDEA 全局搜索快捷键Ctrl +Shift+F不起作用的原因和解决方法

    排查IDEA 全局搜索快捷键Ctrl +Shift+F不起作用的原因和解决方法 参考文章: (1)排查IDEA 全局搜索快捷键Ctrl +Shift+F不起作用的原因和解决方法 (2)https:// ...

  7. 从计算机复制u盘慢怎么解决方法,U盘传输速度慢怎么办 u盘传文件慢的解决办法-电脑教程...

    U盘传输速度慢怎么办?相信不少朋友也会遇到这种问题.就像小编近期遇到的问题一样,在将下载好的Win7系统镜像文件下载到电脑中后,传输到制作好的U盘启动盘时,发现其传输速度不足5MB/s,如下图.这对于 ...

  8. html设置margin无效,CSS中margin不起作用的原因及解决方法

    margin是一个属性,指定元素和元素之间的间距,但不能为内联元素指定边距,本篇文章将给大家介绍关于CSS中margin不起作用的原因及解决方法. margin不起作用的原因 对于初学者来说,可能会经 ...

  9. springboot依赖lib外置打成压缩包,以及snapshot依赖jar包ClassNotFoundExcepttion异常的解决办法

    springboot依赖lib外置打成压缩包,以及snapshot依赖jar包ClassNotFoundExcepttion异常的解决办法 mvn插件 assembly压缩zip assembly.x ...

最新文章

  1. julia有 pytorch包吗_有了Julia语言,深度学习框架从此不需要计算图
  2. 你之所以没成为成就,就是因为太刻苦了!
  3. vFORUM十大“最”看点,带你“撩”会议
  4. 多行文本注视 php,多行文本进行截断的奇淫巧技
  5. 01.神经网络和深度学习 W4.深层神经网络
  6. python做插件应用_Python插件机制实现详解
  7. CSS 背景尺寸 background-size属性
  8. eclipse你的主机中的软件中止了一个已建立的连接。_如何备份/恢复一个基于Windows系统的操作面板?...
  9. Matlab图像处理系列2———空间域平滑滤波器
  10. HBase学习笔记:HBase数据库介绍
  11. 如何通过5S管理改变工作环境?
  12. CentOS6.x安装方法超详细教程
  13. unityUI控制角色的动画
  14. 十二星座物语,女生最喜欢的星座性格【10】
  15. 保姆式Cocos合成大西瓜案例
  16. SAP财务凭证常见的冲销步骤详细操作手册(FB08、AB08、VF11、FBRA等)
  17. Maven问题记录:本地打包成功,远程打包报错,找不到依赖包
  18. 【面试】蜻蜓FM2020秋季校园招聘
  19. 全球及中国云视频会议解决方案行业研究及十四五规划分析报告
  20. 最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比

热门文章

  1. sencha 重置_ZK Framework与Sencha GXT的简要比较
  2. 怎样成为快速阅读的高手(中)
  3. 物联网EIOT能源管理平台适用于哪些场合
  4. DNS服务——搭建企业内网DNS服务器的作用
  5. 手把手教你1小时快速建站
  6. BBSIT.NET-第一综合性IT资讯与互动垂直媒体
  7. 祈祷雅安,TurboMail邮件系统的抗灾功能协助企业在灾后重建
  8. vue路由登录拦截器_Vue路由器
  9. php 检测表格双击操作,PHP+jQuery实现双击修改table表格功能示例
  10. js mouseup和mousedown 阻止冒泡事件-解决方法