附上一篇文章(@Transactional注解的失效场景 - 青柳依依 - 博客园)
1、@Transactional 应用在非 public 修饰的方法上
2、@Transactional 注解属性 propagation 设置错误。若是错误的配置以下三种 propagation,事务将不会发生回滚。
TransactionDefinition.PROPAGATION_SUPPORTS
:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。TransactionDefinition.PROPAGATION_NOT_SUPPORTED
:以非事务方式运行,如果当前存在事务,则把当前事务挂起。TransactionDefinition.PROPAGATION_NEVER
:以非事务方式运行,如果当前存在事务,则抛出异常。3、@Transactional 注解属性 rollbackFor 设置错误
rollbackFor
可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked
异常(继承自RuntimeException
的异常)或者Error
才回滚事务;其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。若在目标方法中抛出的异常是rollbackFor
指定的异常的子类,事务同样会回滚。4、同一个类中方法调用,导致@Transactional失效。
5、异常被你的 catch“吃了”导致@Transactional失效。
6、数据库引擎不支持事务。
循环批量插入是事务发挥作用经典场景。
1、批量插入的问题
/
2、@Transactional事务 和 try-catch 以及 throws Exception 的关系问题
故:在此处的serviceImpl方法中,不要再try-catch,throws Exception就行了[或者不要把try-catch加在数据库操作上],
避免造成事务失效(尽管不加事务批量插入部分失败时,也会全部回滚)。