spring事务失效的场景
spring事务的七种传播机制
事务方法发生了相互调用,事务如何传播:a调用b
- REQUIRED(spring默认的事务传播级别):如果当前(a)没有事务,则(b)新建一个事务,如果当前存在事务,则加入这个事务。
- REQUIRES_NEW:新建一个事务,如果当前存在事务,则挂起这个事务。各自有各自的事务
- SUPPORTS:如果当前存在事务,则加入这个事务。如果当前不存在事务,则以非事务方式运行
- NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则挂起事务,(a有事务就以事务方式运行,b以非事务方式运行)
- MANDATORY:当前存在事务,则加入这个事务,当前没有事务,则抛出异常
- NESTED:嵌套创建事务。如果当前存在事务,开启一个子事务。没有事务,就新建一个事务。(和required类似)
- NEVER:非事务方式运行,当前存在事务,抛出异常
ps:
REQUIRES_NEW:新建的事务和原来事务无关,互不影响
Nested:父事务回滚时,子事物也会回滚
spring事务失效的场景
1.数据库不支持事务(MyIsam):spring事务是基于数据库的,数据库引擎不支持事务。
2.没有被spring管理:比如业务层没有@Service注解,不由spring管理,自然事务不会生效。
3.spring没有开启事务:spring没有配置事务管理器DataSourceTransactionManager
4.spring不支持事务:事务传播机制的never或者not_supported这类,不支持事务。
5.方法不是public的:@Transation注解只能用于public方法的注解上。除非开启Aspectj代理模式
6.自身调用问题:spring事务通过aop来实现事务操作,如果只是类中使用this.或者直接调用方法,那就是相当于在代理类中调用了类中一个方法,事务自然失效。可以将自身注入,通过bean调用。
7.事务不会回滚:spring默认只会回滚非检查异常,RuntimeException,如果你想触发其他异常的回滚,需要在注解上使用rollbackfor配置一下
8.自己吞了异常:使用try cache将异常处理了,不抛异常,事务失效。