Spring7个事务传播行为和5个隔离级别

事务方法A被事务方法B调用,就要指定事务如何传播,是两者共用同一事务还是另起一个新事务。注解默认使用就是这个事务传播行为。如果当前存在事务,则该事务;如果当前没有事务,则创建一个新的事务。先创建一个,如果当前存在事务则把当前事务。也就是说不管外部方法是否开启事务,修饰的内部方法都会新开启自己的事务,且如果当前存在事务,则该事务;如果当前没有事务,以非事务的方式运行。如果当前存在事务,则把当前事务。如果当前没有事务,以非事务方式运行。如果当前存在事务,则该事务;如果当前没有事务,则抛出异常。

传播行为

事务传播行为是为了解决业务层方法之间互相调用的事务问题。

事务方法 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.NEST(嵌套)

如果当前存在事务,则创建一个新事务作为当前事务的嵌套事务来运行;如果当前没有事务,则创建新事务。

隔离级别

spring 的事务隔离级别和 mysql 几乎一模一样。

DEFAULT

使用后端数据库默认隔离级别,Mysql 默认是可重复读

READ_UNCOMMITED

最低的隔离级别,允许读取尚未提交的数据变更,有脏读、幻读、不可重复读的问题。

READ_COMMITED

允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

REPEATABLE_READ

对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

SERIALIZABLE

最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就不产生干扰,阻止幻读。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计