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

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


如您所见,我有一个实体循环,每个实体都在具有NEW事务的单独方法中处理。请确认我的假设:


如果方法B中存在异常,则当方法A返回时,不应将此方法中进行的所有更改保存到DB。
如果方法B中没有异常,那么即使有方法A引起的父事务处理,也要立即将对方法B所做的更改提交给DB。

最佳答案

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


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


  如果方法B中没有异常,那么即使有方法A引起的父事务处理,也要立即将对方法B所做的更改提交给DB。


究竟

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

07-28 02:13
查看更多