gpt4 book ai didi

Java EE 事务回滚

转载 作者:行者123 更新时间:2023-11-30 08:34:59 25 4
gpt4 key购买 nike

我有以下 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());

}

我的异常类:

@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(purchase) 的问题;但忽略 em.merge(purchase.getOrder());

更新:循环在 purchaseEjb 中。并且 CreatePurchase 方法在 financeEjb 上

最佳答案

我假设 for 循环中的代码不在 ejb 中或 ejb 中(您没有使用 this)。在那种情况下,很可能是以下问题

EJB 中的容器管理事务最后一次方法调用。根据它忽略、启动或加入事务的事务属性。默认为required,这意味着事务在调用 createPurchase 时开始,并在方法完成时结束(通常是如果这样,代理会小心)。

事务在 RuntimeException 上回滚,当使用 @ApplicationException(rollback = true) 抛出应用程序异常时或已设置 set-rollback-only-flag。

在您的情况下,这些很可能都不会发生在 createPurchase 的事务上下文中。您没有显示 NotEnoughFundsException 的代码,但是 我假设它没有用 @ApplicationException(rollback = true) 注释。

相反,您对 NotEnoughFundsExceptionWithRollback 进行了注释,它由调用 EJB 的客户端抛出事务上下文。

如果您希望整个循环是一个原子操作,您需要将其置于事务上下文中(例如,使用 EJB)

关于Java EE 事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38503772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com