Java EE事务回滚

时间:2016-07-21 12:02:46

标签: java java-ee ejb

我关注了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

1 个答案:

答案 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)