java spring 七种事务传播级别的机制和特性

默认分类 · 2021-10-18

JAVA spring 中的事务传播有点类似于JS中的事件冒泡机制(这里是举例子,便于理解,不要画等号)。在JAVA Spring中传播主要解决事务一致性问题。

假如,现在有两个方法:A.funa 和 B.funb,在funa中调用funb。

// demo.java

A.funa(){
  B.funb();
}

PROPAGATION_REQUIRED (默认级别)

设:funb()传播级别是 PROPAGATION_REQUIRED
funa()有事务,funb()加入该事务; fua()无事务,funb()为自己创建一个新事务

PROPAGATION_SUPPORTS

设:funb()传播级别是 PROPAGATION_SUPPORTS
funa()有事务,funb()加入该事务; fua()无事务,funb()以非事务方式运行

PROPAGATION_MANDATORY

设:funb()传播级别是 PROPAGATION_MANDATORY
funa()有事务,funb()加入该事务; fua()无事务,抛异常

PROPAGATION_REQUIRES_NEW

设:funb()传播级别是 PROPAGATION_REQUIRES_NEW
funa()有事务,funb()创建一个新事务, 并将funa()的事务挂起,funb()执行完成后,funa()才会继续执行

PROPAGATION_NOT_SUPPORTED

设:funb()传播级别是 PROPAGATION_NOT_SUPPORTED
以非事务方式运行,funa()有事务--->执行到funb()--->将funa()的事务挂起--->funb()以非事务方式运行,funb()执行完成后,funa()才会继续执行

PROPAGATION_NEVER

设:funb()传播级别是 PROPAGATION_NEVER
以非事务方式运行,funa()有事务,抛异常

PROPAGATION_NESTED

设:funb()传播级别是 PROPAGATION_NESTED
funa() 如果捕获了 funb()的异常,funb()回滚,但是并不影响已经执行的funa()[也就是说,funa()不回滚]


总结

PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。(默认级别)
PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。 (外部事务不影响内容事务)
PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行。(外部事务cath内部事务时,内部事务不影响外部事务)

java spring
Theme Jasmine by Kent Liao