Spring事务传播的7种机制

  • Spring 事务传播机制包含以下 7 种:

1. Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果

当前没有事务,则创建一个新的事务。

2. Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的

方式继续运行。

3. Propagation.MANDATORY:(mandatory:强制性)如果当前存在事务,则加入该事务;如果当

前没有事务,则抛出异常。

4. Propagation.REQUIRES_NEW:表示创建一个新的事务,如果当前存在事务,则把当前事务挂

起。也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。

5. Propagation.NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。

6. Propagation.NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

7. Propagation.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如

果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。

  • 以上 7 种传播行为,可以根据是否支持当前事务分为以下 3 类:

类一:支持当前事务

REQUIRED(需要有)

如果当前方法没有事务,新建一个事务,如果已经存在一个事务中,则加入这个事务中。

【类比情侣关系:有房子就一起住,没房子一起赚钱买房子。(愿意陪你吃苦的,但一定要有房子)】

SUPPORTS(可以有)

支持当前事务,如果当前没有事务,就以非事务方式执行。

【有房子一起住,没房子租房住(有的住,没房子也无所谓)】

MANDATORY(强制有)

使用当前的事务,如果当前没有事务,就抛出异常。

【有房子一起住,没房子分手(不要陪你吃苦,没房子就分手)】

类二:不支持当前事务

REQUIRES_NEW

新建事务执行,如果当前存在事务,把当前事务挂起。

【不要你的房子,咱们必须一起赚钱买房子。(不住你的房子,必须买新房子)】

NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

【不要你的房子,咱们必须一起租房子(不住你的房子,必须租房子)】

NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

【必须一起租房子,你要有房子就分手(必须一起租房子,你有房子就分手—看不上你的房子,还得陪你还房贷)】

类三:嵌套事务

NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

【有房子咱们以房子维根据地做点小买卖,赚钱了很好继续发展,赔钱了至少还有房子。如果没房子也没关系,一起赚钱买房子(无风险创业,保本懂事型情侣)】

【注:这里的“房子”指的就是事务】

嵌套事务(NESTED)和加入事务(REQUIRED)的区别:

  • 整个事务如果全部执行成功,二者的结果是一样的。

  • 如果事务执行到一半失败了,那么加入事务整个事务会全部回滚;而嵌套事务会局部回滚,不会影

响上一个方法中执行的结果。

猜你喜欢

转载自blog.csdn.net/weixin_43637718/article/details/129339532