传播行为
引言
事务的传播行为指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何的进行呢?
Spring给我们提供了七种不同的传播行为。
行为
举例代码:
ServiceA {
void methodA() {
ServiceB.methodB();
}
}
ServiceB {
void methodB() {
}
}
Propagation_required
如果存在事务,则支持当前事务,如果没有事务则开启一个新的事务
按照上述例子,先执行ServiceA 的A方法,发现上下文中没有事务,则创建一个事务,继续执行,A方法调用B方法,执行到b的时候,发现此时上下文中已经存在事务了,则就加入到当前事务中,并不会重新创建事务,当B失败抛异常,就回滚,否则提交,A方法继续执行,执行成功,提交,如果A此时抛出异常,则直接A,B全都回滚。
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失败还有可能提交。
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类似操作。