Spring事务的传播级别

一、简单说明

传播属性 描述
PROPAGATION_REQUIRED 如果当前没有事务,就创建一个事务,如果当前存在事务,就加入该事务。
PROPAGATION_REQUIRED_NEW 当前的方法必须启动新事务,并在它自己的事务内运行,不管是否存着事务,都开启新事务。
PROPAGATION_SUPPORTS 如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务的方式执行。
PROPAGATION_NOT_SUPPORTED 当前的方法不应该运行在事务中,如果有运行的事务,将它挂起
PROPAGATION_MANDATORY 如果当前存在事务,就加入当前事务,如果当前不存在事务,就抛出异常
PROPAGATION_NEVER 当前的方法不应该运行在事务中,如果当前存在事务,就抛出异常
PROPAGATION_NESTED 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在它自己的事务内运行。

二、具体案例描述

1.PROPAGATION_REQUIRED

@Transactional(propagation=PROPAGATION_REQUIRED)
pubilc void methodA(){
   
        doPreSomething;
        methodB();
        doSufSomething;
}

@Transactional(propagation=PROPAGATION_REQUIRED)
pubilc void methodB(){
   
        doSomething;
} 

在两个方法的事务传播级别都是PROPAGATION_REQURIED的时候。
如果调用方法A,会开启一个事务,在方法A内部调用方法B,由于方法A已经存在开启尚未提交的事务,方法B不会就不会再开启一个新的事务,方法B会直接加入方法A的事务中执行,这样如果在执行方法B的时候出了异常导致事务回滚,则B的方法和A的方法都会回滚。如果A的doPreSomething()和方法B都执行成功了,但是在执行doSufSomething()方法的时候抛出了异常导致事务回滚,则doSufSomething()、methodB()和doPreSomething()都会回滚。
如果不通过方法A而单独调用方法B,则会开启一个事务。
PROPAGATION_REQURIED所有方法公用一个事务,要么一起成功提交,要么一起失败回滚。
如果嵌套执行的方法要求一起执行成功或者一起回滚,则选择该事物传播级别。

执行逻辑:

开启事务
执行方法A的doPreSomething
执行方法B
执行方法A的doSufSomething
提交或回滚事务

2.PROPAGATION_REQUIRED_NEW

@Transactional(propagation=PROPAGATION_REQUIRED)
pubilc void methodA(){
   
        doPreSomething;
        methodB();
        dosufSomething;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值