我有一个关于spring transaction propagation的问题 . 我理解不同的Spring事务传播,即 Propagation.REQUIRED
, Propagation.REQUIRES_NEW
等 . 我不清楚的是,如果嵌套事务具有不同的传播值,它将如何表现 .
例如,如果我使用 @Transactional(propagation = Propagation.REQUIRED)
来注释方法 m1
. 如果我调用注释为 REQUIRES_NEW
的方法 m2
. 会有什么样的行为?如果在 m2
中发生异常,它将回滚 m2
和 m1
中的更改,或仅回滚 m1
的更改 . 同样 m1
注释为 REQUIRES_NEW
, m2
注释为 REQUIRED
.
1 回答
它在spring documentation for Transaction Propagation中得到了很好的解释 .
方法的传播行为定义了Spring在该方法的进入/退出时的行为方式,以及当时事务已经存在(或不存在)时会发生什么 .
堆栈上方法的传播行为(无论是调用你的方法)都是无关紧要的 .
对于你的例子:
外(m1):
REQUIRED
内(m2):
REQUIRES_NEW
结果:将为m2创建一个完全独立的事务,它可以单独提交/回滚 . 具有
REQUIRED
的m1与m2无关 .外(m1):
REQUIRES_NEW
内(m2):
REQUIRED
结果:Spring将在输入m2时检查事务是否存在,或者如果不存在则创建一个事务 .