IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【记】自定义切面导致的事务失效问题 -> 正文阅读

[Java知识库]【记】自定义切面导致的事务失效问题

自定义切面导致的事务失效问题

1、问题引出

在本地测试中,发现在一段被@Transaction注解标注的方法即使抛出了RunTimeException,数据库依然会有新的记录产生,也就是事务没有回滚,代码如下:
在这里插入图片描述
多次检查事务相关都没有的配置都没有问题,然后在Spring的事务方法中,打上断点,看下具体的执行逻辑:
在这里插入图片描述
后来发现,retVal = invocation.proceedWithInvocation(); 执行完后,没有进cache代码块,而是直接进入commitTransactionAfterReturning ,因此走了提交逻辑,那么明明抛出异常了为什么没有进cache呢?
原来是自定义的切面影响的,自定义的切面 也切了这个方法,并且如果发生异常,统一cache,返回一个统一的Result对象,因此走到这里的时候,已经没有异常了。最根本的原因就是方法抛出的异常被try-cach抓住了,因此没有回滚,只是这个try-cache比较隐晦,在aop的切面中,因此一时间没有发现。
在这里插入图片描述
业务逻辑抛出的异常,被自定义切面抓取了,并且没有往外抛出,最终事务切面切到的方法没有抛出异常,因此提交了。

2、解决方法

对于解决方式,只要能让事物的切面获取到抛出的异常就行了,因此可以在自定义切面中再进行抛出,另外也可以手动控制事务,设置rollbackOnly属性。
在这里采取修改切面的执行顺序,选择将事务切面放到自定义切面的里层,这样抛出的异常首先被事务切面获取,所以事务生效,另外事务切面拿到异常后会重复抛出,不会影响自定义切面。
所有在自定义切面上加上@Order()注解,其中数字越小,优先级越高,越先执行。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 16:37:29  更:2021-12-02 16:39:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:57:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码