事务的7种传播

事务传播行为是指一个事务方法被另一个事务方法调用时如何进行。Spring定义了7种传播行为:PROPAGATION_REQUIRED(使用现有事务或新建)、PROPAGATION_SUPPORTS(支持现有事务或非事务执行)、PROPAGATION_MANDATORY(必须存在事务,否则异常)、PROPAGATION_REQUIRES_NEW(新建独立事务)、PROPAGATION_NOT_SUPPORTED(非事务执行,挂起现有事务)、PROPAGATION_NEVER(非事务执行,现有事务则抛异常)、PROPAGATION_NESTED(嵌套事务,类似于PROPAGATION_REQUIRES_NEW但允许回滚)。PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED的区别在于,前者是完全独立的事务,后者是外部事务的子事务,回滚规则不同。
摘要由CSDN通过智能技术生成

什么叫事务传播行为?听起来挺高端的,其实很简单。 
即然是传播,那么至少有两个东西,才可以发生传播。单体不存在传播这个行为。

事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。 
例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。

 

Spring定义了七种传播行为:

这里写图片描述

 

现在来看看传播行为

1、PROPAGATION_REQUIRED

如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 
可以把事务想像成一个胶囊,在这个场景下方法B用的是方法A产生的胶囊(事务)。 
这里写图片描述

举例有两个方法:

 
  1. @Transactional(propagation = Propagation.REQUIRED)

  2. public void methodA() {

  3. methodB();

  4. // do something

  5. }

  6.  
  7. @Transactional(propagation = Propagation.REQUIRED)

  8. public void methodB() {

  9. // do something

  10. }

单独调用methodB方法时,因为当前上下文不存在事务,所以会开启一个新的事务。 
调用methodA方法时,因为当前上下文不存在事务,所以会开启一个新的事务。当执行到methodB时,methodB发现当前上下文有事务,因此就加入到当前事务中来。

2、PROPAGATION_SUPPORTS

如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。 
举例有两个方法:

 
  1. @Transactional(propagation = Propagation.REQUIRED)

  2. public void methodA() {

  3. methodB();

  4. // do something

  5. }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值