Spring 事务的传播机制
一、事务是什么?
将一组 sql 定义为一个事务,当某一个 sql 执行异常时,整组 sql 都将执行回滚操作。
二、Spring 事务的原理
@Transactional 注解, 通过动态代理实现。Spring 在容器初始化时,通过 BeanPostProcessor 扫描带有事务注解的 Bean,为其生成代理对象,然后在方法前后加入事务管理代码。
三、Spring 事务的传播机制
解释一下标题,多个事务方法之间存在调用关系,事务的传播方式是什么样的?
注:下面例子中 A(调用)-> B(被调用)
3.1 REQUIRED 和 REQUIRES_NEW
- Propagation.REQUIRED:(required)
默认的事务传播级别。如果当前存在事务, 则加⼊该事务; 如果当前没有事务,则创建⼀个新的事务。
A 有事务,B 直接加入 A 的事务。A 没事务,B 创建新的事务。 - Propagation.REQUIRES_NEW:(requires_new)
创建⼀个新的事务。如果当前存在事务,则把当前事务挂起。也就是说不管外部⽅法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部⽅法都会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。
无论 A 有无事务,B 都创建新的事务
3.2 SUPPORTS 和 NOT_SUPPORTED
- Propagation.SUPPORTS : (supports)
如果当前存在事务,则加⼊该事务。如果当前没有事务,则以⾮事务的⽅式继续运⾏。
A 有事务,B 就直接使用 A 的事务,如果 A 没有事务,B 以非事务的方式进行运行 - Propagation.NOT_SUPPORTED:(not supported)
以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起(不⽤)。
就是不管 A 有无事务,B 都直接以非事务的方式进行运行
3.3 MANDATORY、NEVER、NESTED
- Propagation.MANDATORY:(mandatory)
强制性。 如果当前存在事务,则加⼊该事务。如果当前没有事务,则抛出异常。
A 有事务,B 就直接使用 A 的事务,如果 A 没有事务,那么就直接抛出异常 - Propagation.NEVER:(never)
以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常
如果A事务存在,那么就直接抛出异常。 - Propagation.NESTED : (nested)
如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏。
如果当前没有事务, 则该取值等价于 PROPAGATION_REQUIRED
没有事务就创建事务,有的话就干点其他的事情
总结
| 类型 | A有事务 | A无事务 |
|---|---|---|
| required | 使用A事务 | 创建新事务 |
| requires_new | 创建新事务 | 创建新事务 |
| supports | 使用A事务 | 非事务 |
| not supported | 非事务 | 非事务 |
| mandatory | 使用A事务 | ❌ |
| never | ❌ | 非事务 |
| nested | 创建嵌套事务 | 创建新事务 |
本文来自博客园,作者:帅气的涛啊,转载请注明原文链接:https://www.cnblogs.com/handsometaoa/p/18787232

浙公网安备 33010602011771号