Spring7个事务传播行为和5个隔离级别
传播行为
事务传播行为是为了解决业务层方法之间互相调用的事务问题。
事务方法A被事务方法B调用,就要指定事务如何传播,是两者共用同一事务还是另起一个新事务。
图解spring中七种事务传播行为 终于有人讲明白了_spring七种事务传播行为-CSDN博客
1. REQUIRED
@Transactional
注解默认使用就是这个事务传播行为。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
2. REQUIRES_NEW
先创建一个新事务,如果当前存在事务则把当前事务挂起。也就是说不管外部方法是否开启事务,
Propagation.REQUIRES_NEW
修饰的内部方法都会新开启自己的事务,且开启的事务相互独立,互不干扰。
3. SUPPORTS
如果当前存在事务,则加入该事务;如果当前没有事务,以非事务的方式运行。
4. NOT_SUPPORTED
如果当前存在事务,则把当前事务挂起。如果当前没有事务,以非事务方式运行。
5. MANDATORY(强制性)
如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)
6. NEVER
如果当前存在事务,则抛出异常。如果当前没有事务,以非事务方式运行,
7.NESTE(嵌套)
如果当前存在事务,则创建一个新事务作为当前事务的嵌套事务来运行;如果当前没有事务,则创建新事务。
隔离级别
spring的事务隔离级别和mysql几乎一模一样。
DEFAULT
使用后端数据库默认隔离级别,Mysql默认是可重复读
READ_UNCOMMITED
最低的隔离级别,允许读取尚未提交的数据变更,有脏读、幻读、不可重复读的问题。
READ_COMMITED
允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
REPEATABLE_READ
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE
最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就不产生干扰,阻止幻读。