@Transational有效的条件

@Transational失效的场景

@Transactional 注解属性 rollbackFor 设置错误

rollbackFor 可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。

1、默认情况下,Spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。
checked异常:java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常;
unchecked异常:其他继承自java.lang.Exception得异常统称为Checked Exception,如IOException、TimeoutException等;
@Transational有效的条件

同一类中方法调用

声明式事物:@Transactional注解是一种声明式事物,基于AOP的面向切面编程,它将具体业务与事务处理部分解耦,代码侵入性很低,所以在实际开发中声明式事务用的比较多。因此,@Transactional注解只有当事务方法被当前类以外的代码调用时,才会由Spring生成的代理对象来管理,从而生效。同一类中方法调用失败。

数据库引擎不支持事务

这种情况出现的概率并不高,事务能否生效数据库引擎是否支持事务是关键。常用的MySQL数据库默认使用支持事务的innodb引擎。一旦数据库引擎切换成不支持事务的myisam,那事务就从根本上失效了。

@Transactional 注解属性 propagation 设置错误

这种失效是由于配置错误,若是错误的配置以下三种 propagation,事务将不会发生回滚。

TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。 TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。 TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

异常被你的 catch“吃了”

解决注解不回滚问题

1,检查方法是不是public
2,检查异常是不是unchecked异常
3,如果是checked异常也想回滚的话,注解上写明异常类型即可@Transactional(rollbackFor=Exception.class)

参考文献:https://zhuanlan.zhihu.com/p/114461128
https://www.cnblogs.com/hunrry/p/9183209.html