Springboot事务失效的原因及解决办法详解

 更新时间:2023年10月19日 09:54:59   作者:zsycode  
这篇文章主要介绍了Springboot事务失效的原因及解决办法详解,spring中的事务是依赖AOP的,AOP是通过动态代理实现的,只有通过代理类访问的方法才能被拦截,而addMultiFile直接内部调用了addFile方法,所以addFile中的事务就不会生效

问题

先看下问题代码,下面两个方法属于同一个service类

@Transactional(rollbackFor = Exception.class)
    public void addFile(FileDTO file, String operator) {
    	//一些列操作
    	...
    }
public void addMultiFiles(MultipartFile[] files, String operator) throws IOException {
	...
	addFIle();
	...
}

如图,addFile添加了事务管理,然后通过测试addMultiFile测试时addFile中的事务失效,无法在出现异常时回滚数据库。

原因

spring中的事务是依赖AOP的,AOP是通过动态代理实现的,只有通过代理类访问的方法才能被拦截(外部调用都是调用的相应的代理类)

而上述问题中addMultiFile直接内部调用了addFile方法,所以addFile中的事务就不会生效。

解决办法

知道原因之后就好解决了,想办法获取该service类的代理类,通过代理类来调用addfile方法就行

public void addMultiFiles(MultipartFile[] files, String operator) throws IOException {
	...
	/*进行上传,直接内部调用会导致事务失效,需要获取相应的代理对象来调用*/
   ((FileService)AopContext.currentProxy()).addFile(fileDTO, operator);
	...
}

加入后运行会报个错,需要你设置exposeProxy = true 在该类上加个注解

@EnableAspectJAutoProxy(exposeProxy = true)  //暴露代理对象
public class FileService {
	...
}

此时addFile就能正常回滚

补充

加入@EnableAspectJAutoProxy提示找不到该类 原来是自己没有导入aop的相关依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

到此这篇关于Springboot事务失效的原因及解决办法详解的文章就介绍到这了,更多相关Springboot事务失效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java集合Set、List、Map的遍历方法

    Java集合Set、List、Map的遍历方法

    这篇文章主要介绍了Java集合Set、List、Map的遍历方法,是非常实用的遍历技巧,需要的朋友可以参考下
    2014-09-09
  • Java日常练习题,每天进步一点点(40)

    Java日常练习题,每天进步一点点(40)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Linux安装JDK两种方式详细教程(附图)

    Linux安装JDK两种方式详细教程(附图)

    这篇文章主要给大家介绍了关于Linux安装JDK两种方式详细教程的相关资料,Linux的使用相信大家都要用到java吧,在使用java前我们得先安装jdk以及配置环境变量等工作,需要的朋友可以参考下
    2023-11-11
  • 用java实现杨辉三角的示例代码

    用java实现杨辉三角的示例代码

    本篇文章主要介绍了用java实现杨辉三角的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • idea导入module全流程

    idea导入module全流程

    这篇文章主要介绍了idea导入module全流程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • IntelliJ IDEA 详细图解最常用的配置(适合刚刚用的新人)

    IntelliJ IDEA 详细图解最常用的配置(适合刚刚用的新人)

    这篇文章主要介绍了IntelliJ IDEA 详细图解最常用的配置,本篇教程非常适合刚刚用的新人,本文图文并茂给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java编程实现的模拟行星运动示例

    Java编程实现的模拟行星运动示例

    这篇文章主要介绍了Java编程实现的模拟行星运动,涉及java基于swing组建绘制动态效果及数值运算相关操作技巧,并总结分析了java面向对象的相关特性,需要的朋友可以参考下
    2018-04-04
  • 详解Java实践之建造者模式

    详解Java实践之建造者模式

    建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象
    2021-06-06
  • Spring详细解读事务管理

    Spring详细解读事务管理

    Spring事务的本质就是对数据库事务的支持,没有数据库事务,Spring是无法提供事务功能的。Spring只提供统一的事务管理接口,具体实现都是由数据库自己实现的,Spring会在事务开始时,根据当前设置的隔离级别,调整数据库的隔离级别,由此保持一致
    2022-04-04
  • 使用Java实现在Excel中创建下拉列表

    使用Java实现在Excel中创建下拉列表

    下拉列表(下拉框)可以确保用户仅从预先给定的选项中进行选择,这样不仅能减少数据输入错误,还能节省时间提高效率,下面我们就来看看如何在java中利用免费库实现创建下拉列表吧
    2024-03-03

最新评论