我关注了ejb:
for (int i = 1; i <= shopItem.getQuantity(); i++) {
purchase = new Purchase();
purchase.setUser(user);
// a lot of sets
purchase.setPhoneNumber(order.getPhoneNumber());
try {
financeEntityEjb.createPurchase(purchase);
} catch (NotEnoughFundsException e) {
throw new NotEnoughFundsExceptionWithRollback(e); // Making in rollable
}
}
public void createPurchase(Purchase purchase) throws InputValidationException, NotEnoughFundsException {
// a lot of calculations
em.persist(purchase);
em.flush();
/* Closing Order */
purchase.getOrder().setState(Order.State.PURCHASED);
em.merge(purchase.getOrder());
}
My Exception class:
@ApplicationException(rollback = true)
public class NotEnoughFundsExceptionWithRollback extends NotEnoughFundsException {
public NotEnoughFundsExceptionWithRollback() {
}
public NotEnoughFundsExceptionWithRollback(Throwable e) {
super(e);
}
public NotEnoughFundsExceptionWithRollback(String message, Throwable e) {
super(message, e);
}
}
所以我有问题,ejb回滚所有em.persist(购买);但是忽略了em.merge(purchase.getOrder());
UPD:Loop在purchaseEjb中。和CreatePurchase方法在financeEjb
上答案 0 :(得分:2)
我假设for循环中的代码不在ejb中,或者是ejb(你没有使用this
)。在这种情况下,问题很可能是以下
EJB中的容器管理事务最后一个方法调用。它根据事务属性忽略,启动或加入事务。
默认值为 required ,这意味着事务在调用createPurchase
时开始,并在方法完成时结束(
代理小心如果这个)。
当RuntimeException
引发应用程序异常时或者当@ApplicationException(rollback = true)
引发应用程序异常时,事务将在createPurchase
上回滚
已设置set-rollback-only-flag。
在您的情况下,很可能这些都不会发生在NotEnoughFundsException
的交易环境中。您没有显示@ApplicationException(rollback = true)
的代码,但是
我假设它没有用NotEnoughFundsExceptionWithRollback
注释。
相反,您已注释null
,它由调用EJB的客户端抛出事务上下文之外。
如果您希望整个循环是原子操作,则需要将其放在事务上下文中(例如,使用EJB)