1.确保已开启TransactionManagment
- 如果你的项目引入了boot-starter的jar包,则不需要自己配置DataSourceTransactionManager,springboot自动配置特性会帮你配置。
- 如果未正确配置,则需在Application启动类上,使用注解@EnableTransactionManagement让springboot帮你配置。
- 不建议重写config类,自己实现改配置
2.确保@Transactional注解的方法的修饰符
- @Transaction作用于类上,则该类下的所有public方法生效
- @Transaction作用于方法上,只有public修饰的方法生效,其余不生效
3.确保调用的是AOP代理的方法
@Transaction注解基于aop代理生效,所以只有在使用代理类的带有注解的方法才会生效。比如,方法内调用同类含有@Transaction注解的其他方法,则执行的是本类方法,而不是代理类的方法,所以不会生效。
4.确保@Transaction的回滚异常
- 手动try/catch异常后,不再自动进行事务回滚.
- 可在.catch语句中最后增加
throw new RuntimeException()
语句,以便让aop捕获异常再去回滚. - 在catch语句中设置手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- 可在.catch语句中最后增加
- 抛出的异常为不回滚异常,注解默认回滚RuntimeException和Error,其他查询异常不会回滚,可以使用@Transaction的rollbackFor和noRollbackFor属性设置回滚/不回滚异常类型
5.@Transactional 注解属性 propagation 设置错误
propagation 为事务的传播行为,如果设置了不恰当的传播行为可能导致操作已非事务的方式执行,也就不可能进行回滚. 例如:将 propagation 设置为 PROPAGATION_NOT_SUPPORTED 指定的方法不能在事务环境中执行,若当前存在事务,就将当前事务挂起。
6.数据库表引擎不支持事务
例如MySQL的MyISAM引擎.