@Transactional失效的场景
-
注解加载非public的方法上 应为spring是通过aop实现事务的,查看源码发现,非public的方法是不会被aop拦截的
-
事务设置的传播级别设置错误 以下级别是不会回滚事务的
a.TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
b.TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
c.TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
-
rollbackFor 可以设定指定的异常情况下回滚,如果没有发生指定的异常就不会滚 默认是只要有异常就抛出unChecked异常
-
一个方法调用同一个类型的方法,这也是aop代理造成的,因为只有外部的方法调用本类,然后走aop代理才会生成事务
-
异常信息在代码中catch掉了,就会跑异常,也就不会回滚了
-
数据库不支持事务