EjbConetxt setRollbackOnly 与 ApplicationException rollback true

Kri*_*nya 2 java transactions java-ee-6

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

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

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

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
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 5

如果异常在 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) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,由于异常不会跨越任何事务性 EJB 方法的边界,因此容器不会意识到此异常,并且不会回滚,除非您从catch 块,或显式地将事务标记为 rollbackOnly。