Spring 事务的传播机制

一、事务是什么?

将一组 sql 定义为一个事务,当某一个 sql 执行异常时,整组 sql 都将执行回滚操作。

二、Spring 事务的原理

@Transactional 注解, 通过动态代理实现。Spring 在容器初始化时,通过 BeanPostProcessor 扫描带有事务注解的 Bean,为其生成代理对象,然后在方法前后加入事务管理代码。

三、Spring 事务的传播机制

解释一下标题,多个事务方法之间存在调用关系,事务的传播方式是什么样的?

注:下面例子中 A(调用)-> B(被调用)

3.1 REQUIRED 和 REQUIRES_NEW

  1. Propagation.REQUIRED:(required)
    默认的事务传播级别。如果当前存在事务, 则加⼊该事务; 如果当前没有事务,则创建⼀个新的事务。
    A 有事务,B 直接加入 A 的事务。A 没事务,B 创建新的事务。
  2. Propagation.REQUIRES_NEW:(requires_new)
    创建⼀个新的事务。如果当前存在事务,则把当前事务挂起。也就是说不管外部⽅法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部⽅法都会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。
    无论 A 有无事务,B 都创建新的事务

3.2 SUPPORTS 和 NOT_SUPPORTED

  1. Propagation.SUPPORTS : (supports)
    如果当前存在事务,则加⼊该事务。如果当前没有事务,则以⾮事务的⽅式继续运⾏。
    A 有事务,B 就直接使用 A 的事务,如果 A 没有事务,B 以非事务的方式进行运行
  2. Propagation.NOT_SUPPORTED:(not supported)
    以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起(不⽤)。
    就是不管 A 有无事务,B 都直接以非事务的方式进行运行

3.3 MANDATORY、NEVER、NESTED

  1. Propagation.MANDATORY:(mandatory)
    强制性。 如果当前存在事务,则加⼊该事务。如果当前没有事务,则抛出异常。
    A 有事务,B 就直接使用 A 的事务,如果 A 没有事务,那么就直接抛出异常
  2. Propagation.NEVER:(never)
    以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常
    如果A事务存在,那么就直接抛出异常。
  3. Propagation.NESTED : (nested)
    如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏。
    如果当前没有事务, 则该取值等价于 PROPAGATION_REQUIRED
    没有事务就创建事务,有的话就干点其他的事情

总结

类型 A有事务 A无事务
required 使用A事务 创建新事务
requires_new 创建新事务 创建新事务
supports 使用A事务 非事务
not supported 非事务 非事务
mandatory 使用A事务
never 非事务
nested 创建嵌套事务 创建新事务
posted @ 2025-03-22 22:31  帅气的涛啊  阅读(87)  评论(0)    收藏  举报