1、数据库引擎不支持事务

从MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是白搭。

2、类没有被spring管理

类上少了类似:@Component,@Controller,@Service, @Mapper或@Repository等注解。

3、@Transactional注解用在了非public修饰的方法上

4、同一个类中方法互相调用(自调用)

同一个类中方法A调用方法B(B方法上有@Transactional),无论方式A上是否有事务注解都会引起事务失效,因为只有当事务方法被当前类以外的代码调用时,才会由spring生成代理对象,通俗点讲:自调用时该类对> 象还没有被spring管理。

5、传播行为配置成了不支持事务:Propagation.NOT_SUPPORTED表示不以事务运行,当前若存在事务则挂起。

6、异常被try-catch“吃掉了”

例如:Service中的方法抛出了一个异常,然而在controller中又对异常进行的try-catch,service抛出异常表示要回滚,然后controller中又对异常进行了捕获和处理,controller中就会认为当前方法是正常提> 交的,不需要回滚,事务自然就会失效。

7、数据源没有配置事务管理器

spring事务失效的8大场景_spring

8、异常类型不匹配

spring事务失效的8大场景_spring事务失效_02