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

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

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

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

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

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

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

      检查结果:已开启

5、以下是几种事务方法的调用及事务的生效情况(原文链接: )

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

spring 多个事务回滚 spring 事务回滚条件_spring 多个事务回滚

图二:事务生效

spring 多个事务回滚 spring 事务回滚条件_spring_02

图三:事务生效

spring 多个事务回滚 spring 事务回滚条件_方法调用_03

图四:事务生效

spring 多个事务回滚 spring 事务回滚条件_spring 多个事务回滚_04

图五:事务生效

spring 多个事务回滚 spring 事务回滚条件_修饰符_05

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

spring 多个事务回滚 spring 事务回滚条件_修饰符_06

图七:事务生效。这里必须说几句:这是我们解决方法内部调用事务不生效的最常用方法之一:内部维护一个注入自己的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

spring 多个事务回滚 spring 事务回滚条件_spring 多个事务回滚_07