我对弹簧交易传播有疑问。我理解不同的Spring事务传播,即Propagation.REQUIRED
,Propagation.REQUIRES_NEW
等。我不清楚的是,如果嵌套事务具有不同的传播值,它将如何表现。
例如,如果我使用@Transactional(propagation = Propagation.REQUIRED)
注释方法m1
。如果我调用注释为m2
的方法REQUIRES_NEW
。会有什么样的行为?如果m2
中发生异常,它将回滚m2
和m1
中的更改,或仅回滚m1
的更改。
同样,m1
注明为REQUIRES_NEW
,m2
注明为REQUIRED
。
答案 0 :(得分:0)
在spring documentation for Transaction Propagation中解释得非常好。
方法的传播行为定义了Spring在该方法进入/退出时的行为方式,以及当时事务已经存在(或不存在)时会发生什么。
堆栈上方法的传播行为(无论是调用你的方法)都无关紧要。
对于您的示例:
外(m1):static double[] colorHistogram(Image<Bgr, Byte> img, int rStep, int gStep, int bStep)
{
double[] histogram = null;
return histogram;
}
内部(m2):REQUIRED
结果:将为m2创建一个完全独立的事务,它可以单独提交/回滚。有REQUIRES_NEW
的m1与m2无关。
外(m1):REQUIRED
内部(m2):REQUIRES_NEW
结果:Spring将在输入m2时检查事务是否存在,或者如果不存在则创建一个事务。