spring 事务的传播Propagation.NESTED Propagation.REQUIRED Propagation.REQUIRES_NEW

Propagation.NESTED
Propagation.REQUIRED
Propagation.REQUIRES_NEW

主要说这三种传播类型

场景1 :

事务方法a   调用事务方法b和c

void a(){

  otherClass.b();

try{  

otherClass.c();

}catch(Exception c)

}

 

void c(){

throw new RunTimeException("an exception")

}

注意不能调用本类的事务方法,因为如果采用this.b()的方式,事务会失效

 

a的事务类型不变 一直是   Propagation.REQUIRED

b的事务类型是:Propagation.REQUIRED

1.1 如果事务c类型是Propagation.REQUIRED  结果 :事务b 事务c 均执行失败

1.2 如果事务c类型Propagation.REQUIRES_NEW  结果:事务b执行成功 c失败

1.3 如果事务c类型Propagation.NESTED结果:事务b执行成功 c失败

场景2 :

事务方法a   调用事务方法b和c

void a(){

  otherClass.b();

  otherClass.c();

throw new RunTimeException("an exception")

}

a b 的事务类型不变 一直是   Propagation.REQUIRED

 

2.1 如果事务c类型是Propagation.REQUIRED  结果 :b c 均失败

2.2 如果事务c类型Propagation.REQUIRES_NEW  结果:b失败  c执行成功

2.3 如果事务c类型Propagation.NESTED     结果:b和c均失败

 

从结果中分析:

Propagation.REQUIRED:此类会把事务方法传播到子方法中,不管子类有没有事务,他们都会成为一个事务

Propagation.REQUIRES_NEW 此类不受外围方法的影响,他是独立的 闭关锁国

Propagation.NESTED 此类是两者的结合。其实就是又想独立 又想被外围事务影响。其实就是 如果此类抛出异常,不会影响外围事务,如果外围事务抛出异常 会影响到子事务,应用场景大概就是 比如我想记录一个事务的业务日志,记录业务日志呢 又不影响业务,所以如果在记录日志时发生异常,我当然不希望它会造成业务回滚。如果业务出现异常,记录业务日志也没用意义,所以让业务日志也进行回滚。

  希望大家多多补充  以上代码只是伪代码 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值