gpt4 book ai didi

java - EjbConetxt setRollbackOnly 与 ApplicationException rollback true

转载 作者:行者123 更新时间:2023-12-01 22:16:38 24 4
gpt4 key购买 nike

我有一个方法可以抛出应用程序异常,并且回滚为 true。我想知道是否必须显式调用 ejbContext.setRollbackOnly() ?

文档 here表示当异常标记为rollback=true时,我们不需要调用EjbContext的setRollbackOnly。

在我的例子中,我捕获了一个 ApplicationException,其回滚属性设置为 true。然后我显式调用 ejbContext.setRollbackOnly(),因为我在 catch block 中抛出了另一个异常,并且该异常将传播到客户端。下面是我的代码片段

try {
....
} catch (XYZDirectoryException e) { // ApplicationException marked as rollback=true
ejbContext.setRollbackOnly(); // Is this necessary?
// log exception trace
throw new ServerInternalException("Something bad happened. Please try again or contact administrator. Check logs for more details"); // ApplicationException marked as rollback=false
}

最佳答案

如果异常在 EJB 事务方法内抛出并捕获,则不会导致回滚。它只需从 EJB 事务方法中抛出,以便由 EJB 实例周围的事务代理捕获,否则,容器完全不知道该异常,因此不会回滚:

public void someEjbTransactionalMethod() {
// will cause a rollback
throw new XYZDirectoryException();
}

public void someOtheEjbTransactionalMethod() {
// will NOT cause a rollback
try {
throw new XYZDirectoryException();
}
catch (XYZDirectoryException) {
...
}
}

因此,在您的情况下,由于异常不会跨越任何事务性 EJB 方法的边界,因此容器不会意识到此异常,也不会回滚,除非您抛出另一个“rollback=true” catch block 中的异常,或显式地将事务标记为 rollbackOnly。

关于java - EjbConetxt setRollbackOnly 与 ApplicationException rollback true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30848941/

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