关于spring事务不能回滚问题的解决过程

1、检查数据库引擎设置是否正确,比如我们最常用的mysql,引擎MyISAM,是不支持事务操作的。需要改成InnoDB才能支持

      检查结果:本地数据库引擎设置正确

2、检查方法修饰符是否正确,方法必须是public,否则事务不起作用(这一点由Spring的AOP特性决定的,理论上而言,不public也能切入,但spring可能是觉得private自己用的方法,应该自己控制,不应该用事务切进去吧)。另外private 方法, final 方法 和 static 方法不能添加事务,加了也不生效

      检查结果:方法修饰符正确

3、检查事务回滚异常类型是否正确,本地设置rollbackFor=Exception.class

      检查结果:回滚异常类型设置正确

4、检查application配置是否开启事务

      检查结果:已开启

5、以下是几种事务方法的调用及事务的生效情况(原文链接:https://blog.csdn.net/f641385712/article/details/80445933 )

图一:事务不生效:.@Transactional的事务开启 ,或者是基于接口的 或者是基于类的代理被创建。所以在同一个类中一个无事务的方法调用另一个有事务的方法,事务是不会起作用的(这就是业界老问题:类内部方法调用事务不生效的问题原因)。

事务不生效

图二:事务生效
事务生效

图三:事务生效

这里写图片描述

图四:事务生效

这里写图片描述

图五:事务生效

这里写图片描述

图六:事务不生效(准确的说这叫没有事务)

这里写图片描述

图七:事务生效。这里必须说几句:这是我们解决方法内部调用事务不生效的最常用方法之一:内部维护一个注入自己的Bean,然后使用这个属性来调用方法。其实还有一种方法,那就是利用Aop上下文来获取代理对象(((TestService)AopContext.currentProxy()).create(); ),然后通过代理对象来调用。这里需要注意:Aop上下文spring默认是关闭的,需要手动开启,在配置文件中加入 <aop:aspectj-autoproxy expose-proxy="true" proxy-target-class="true"/>,即可开启,另:依赖jar包:com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

这里写图片描述

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值