java Spring@Transactional传播属性
我有一个关于spring事务传播的问题。我了解不同的Spring事务传播,即Propagation.REQUIRED
、Propagation.REQUIRES_NEW
等。我不清楚的是,在具有不同传播值的嵌套事务的情况下,它会如何表现
例如,如果我使用@Transactional(propagation = Propagation.REQUIRED)
来注释一个方法m1
。如果我调用一个方法m2
,它被注释为REQUIRES_NEW
。会有什么样的行为?如果在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时检查事务是否存在,如果不存在,则创建一个事务