Spring事务的传播机制

172 阅读2分钟

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

27. Spring事务的传播机制

首先,我们要明白Spring的传播特性有几种?7种,分别是Required,Requires_new,nested,Support, NotSupport,Never,Mandatory,首先我们要先了解每种事务的执行方式。

事务传播行为类型说明
PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

如果是单独的事务,大家都很容易能想出来,但如果某一个事务嵌套另一个事务的时候,事务会怎么执行呢?

A方法调用B方法,AB方法都有事务,并且传播特性不同,那么A如果有异常,B怎么办,B如果有异常,A怎么办?

事务的传播特性指的是不同方法的嵌套调用过程中,事务应该如何进行处理,是用同一个事务还是不同的事务,当出现异常的时候会回滚还是提交,两个方法之间的相关影响,在日常工作中,使用比较多的是required,Requires-new,nested

1、首先,事务的处理有三种情况:支持当前事务,不支持当前事务,嵌套事务
2、如果外层方法是required,内层方法是required,requires-new,nested
3、如果外层方法是requwes_new,内层方法是required,requires-new,nested
4、如果外层方法是nested,内层方法是required,requwes-new,nested
核心处理逻辑非常简单
1、判断内外方法是否是同一个事务
是:异常统一在外层方法处理,按照外层的事务处理
不是:内层方法有可能影响到外层方法,但是外层方法是不会影响内层方法的.(但是nested有所不同,nested中有保存点)