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泛型的概念、定义与运行方法分析

    Java泛型的概念、定义与运行方法分析

    这篇文章主要介绍了Java泛型的概念、定义与运行方法,结合实例形式分析了java泛型的基本概念、定义与IDEA、命令行两种运行方法,需要的朋友可以参考下
    2019-08-08
  • Jackson序列化丢失泛型的解决

    Jackson序列化丢失泛型的解决

    这篇文章主要介绍了Jackson序列化丢失泛型的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Spring Cloud Alibaba Nacos Config进阶使用

    Spring Cloud Alibaba Nacos Config进阶使用

    这篇文章主要介绍了Spring Cloud Alibaba Nacos Config进阶使用,文中使用企业案例,图文并茂的展示了Nacos Config的使用,感兴趣的小伙伴可以看一看
    2021-08-08
  • springboot整合nacos的入门Demo及Nacos安装部署

    springboot整合nacos的入门Demo及Nacos安装部署

    Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理,Nacos 致力于帮助您发现、配置和管理微服务,这篇文章主要介绍了springboot整合nacos的入门Demo,需要的朋友可以参考下
    2024-01-01
  • 浅析如何在SpringBoot中实现数据脱敏

    浅析如何在SpringBoot中实现数据脱敏

    脱敏是指在不改变原数据结构的前提下,通过某种方式处理数据,使数据不能直接暴露用户的真实信息,下面我们就来看看SpringBoot中实现数据脱敏的具体方法吧
    2024-03-03
  • Java实战之用Spring开发条形码和验证码

    Java实战之用Spring开发条形码和验证码

    这篇文章主要介绍了Java实战之用Spring开发条形码和验证码,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Spring实现邮件发送功能

    Spring实现邮件发送功能

    这篇文章主要为大家详细介绍了Spring实现邮件发送功能,简单的发送邮件工具JavaMailSender使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • mybatis根据表逆向自动化生成代码的实现

    mybatis根据表逆向自动化生成代码的实现

    若采用mybatis框架,数据库新建表,手动编写的话,需要编写大量的实体类、mapper文件、mapper.xml文件,都是一些重复且有规律的工作。我们可以引用插件,然后做配置,自动生成这些文件,本文就来详细的介绍一下
    2021-08-08
  • 微信开发准备第二步 springmvc mybatis项目结构搭建

    微信开发准备第二步 springmvc mybatis项目结构搭建

    这篇文章主要为大家详细介绍了微信开发准备第二步,springmvc和mybatis项目结构的搭建,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java8处理List的双层循环问题

    Java8处理List的双层循环问题

    这篇文章主要介绍了Java8处理List的双层循环问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论