Java EJBOneText setRollbackOnly vs ApplicationException rollback true

Java EJBOneText setRollbackOnly vs ApplicationException rollback true,java,transactions,java-ee-6,Java,Transactions,Java Ee 6,我有一个方法,它抛出一个应用程序异常,并返回true。我想知道是否必须显式调用ejbContext.setRollbackOnly() 文档中说,只有当异常标记为rollback=true时,才需要调用EjbContext的setRollback 在我的例子中,我捕获了一个ApplicationException,它的rollback属性设置为true。然后显式调用ejbContext.setRollbackOnly(),因为我在catch块中引发了另一个异常,该异常将传播到客户端。下面是我的代

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

文档中说,只有当异常标记为rollback=true时,才需要调用EjbContext的setRollback

在我的例子中,我捕获了一个ApplicationException,它的rollback属性设置为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
}

如果在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方法的边界,容器不会意识到该异常,也不会回滚,除非您从catch块抛出另一个“rollback=true”异常,或者明确地将事务标记为仅回滚。

如果在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方法的边界,容器不会意识到该异常,也不会回滚,除非您从catch块抛出另一个“rollback=true”异常,或者明确地将该事务标记为rollbackOnly