【发布时间】:2021-07-14 11:19:54
【问题描述】:
我们继承了一个同时使用 EJB 和 CDI 的应用程序,例如 EJB 调用 CDI bean 的方法。
当从 EJB 调用 CDI bean 时,我仍然不确定事务管理/处理是如何工作的。
让我们假设以下简单示例:
@Stateless
public class MyEjb {
@Inject
private MyCdi myCdi;
public void doMyEjbStuff() {
myCdi.doMyCdiStuff();
}
}
@ApplicationScoped
public class MyCdi {
public void doMyCdiStuff() {
// some database operations ...
throw new RuntimeException("Error");
}
}
现在doMyEjbStuff() 在事务上下文之外被调用,所以当它被调用时会创建一个新事务。
在这种情况下,我希望在调用doMyEjbStuff() 时创建的事务跨越对doMyCdiStuff() 的调用,并由于异常而回滚。日志应显示javax.ejb.EJBException: Transaction aborted 消息。这是正确的吗?
如果我用@Transactional 注释doMyCdiStuff() 会有什么改变吗?
如果我用@Transactional(Transactional.TxType.REQUIRES_NEW) 注释doMyCdiStuff() 会发生什么?我猜现在抛出了TransactionalException。这个异常会导致调用doMyEjbStuff()启动的事务回滚吗?
【问题讨论】:
标签: jakarta-ee transactions ejb cdi