春季交易的传播是不稳定的

时间:2016-02-14 08:35:45

标签: java spring hibernate

我有一个使用事务服务的Spring / Hibernate应用程序,我对使用新传播时事务如何工作有点困惑:

@Transactional
method A()
    |
    |-loop for each element
       |
       |-@Transactional(propagation=Propagation.REQUIRES_NEW)
         method B()
           |-make some entity change and save()

因此,您可以看到我有一个实体循环,每个实体都在一个具有NEW事务的单独方法中处理。请确认我的假设:

  1. 如果方法B中存在异常,则在方法A返回时,不应将此方法中所做的所有更改保存到DB。
  2. 如果方法B中没有异常,则方法B中所做的更改将立即提交给DB,即使存在由方法A引起的父事务。

1 个答案:

答案 0 :(得分:3)

  

如果方法B中存在异常,则在方法A返回时,不应将此方法中所做的所有更改保存到DB。

不,已经在方法B中提交的更改将保持提交。例如,如果循环中有10个步骤并且在步骤4中发生异常,则将保存在步骤1-3中所做的更改。

  

如果方法B中没有异常,则方法B中所做的更改将立即提交给DB,即使方法A导致父事务。

完全

PS。确保使用Spring调用methodB(),而不仅仅是Java调用。最简单的方法是将methodB()放在另一个类中,与methodA()不同。另一种方法是使用@Resource注释,但它看起来有点棘手。