Springboot-支线1-事务的传播行为

传播行为

引言

事务的传播行为指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何的进行呢?

Spring给我们提供了七种不同的传播行为。

行为

举例代码:

ServiceA {   
     void methodA() {
         ServiceB.methodB();
     }
}
ServiceB { 
     void methodB() {
     }      
}

Propagation_required

如果存在事务,则支持当前事务,如果没有事务则开启一个新的事务

按照上述例子,先执行ServiceA 的A方法,发现上下文中没有事务,则创建一个事务,继续执行,A方法调用B方法,执行到b的时候,发现此时上下文中已经存在事务了,则就加入到当前事务中,并不会重新创建事务,当B失败抛异常,就回滚,否则提交,A方法继续执行,执行成功,提交,如果A此时抛出异常,则直接A,B全都回滚。

image-20201210174734628

Propageation_Supports

支持当前事务,假设当前没有事务,就以非事务的方式运行

Propageation_Mandatory

支持当前事务,假设没有当前事务,就抛出异常

意思是:他仅仅能被一个父事务调用,否则抛异常

Propagation_Requires_New

新建事务,假设当前存在事务,把当前事务挂起

假设A的事务级别为propagation_required,B的事务级别为propagation_requires_new,那么程序开始运行,当到B的时候,A被挂起,B新开事务,等待B事务完毕,A事务继续执行。

假设B事务提交,那么A失败回滚,B不会回滚。

假设B失败回滚,如果B抛出的异常被A捕获,则A失败还有可能提交。

image-20201210181037168

Propagation_Not_Supported

以非事务的方式运行操作,假设当前存在事务,就把当前事务挂起

当前不支持事务,如果说A的事务级别为propagation_required,而b的事务级别为propagation_not_support,那么执行到B的时候,A事务挂起,自己则为非事务执行,之后继续执行A事务。

Propagation_Never

以非事务的方式运行,假设当前存在事务,就抛出异常

不能在事务内执行,假设A的事务级别是propagation_required,而B的事务级别是propagation_never,那么b抛异常。

Propagation_Nested

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值