我有一个使用事务服务的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批注,但看起来有些棘手。