Spring @Transactional传播属性

时间:2015-05-13 01:02:16

标签: java spring spring-transactions

我对弹簧交易传播有疑问。我理解不同的Spring事务传播,即Propagation.REQUIREDPropagation.REQUIRES_NEW等。我不清楚的是,如果嵌套事务具有不同的传播值,它将如何表现。

例如,如果我使用@Transactional(propagation = Propagation.REQUIRED)注释方法m1。如果我调用注释为m2的方法REQUIRES_NEW。会有什么样的行为?如果m2中发生异常,它将回滚m2m1中的更改,或仅回滚m1的更改。 同样,m1注明为REQUIRES_NEWm2注明为REQUIRED

1 个答案:

答案 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时检查事务是否存在,或者如果不存在则创建一个事务。