EjbConetxt setRollbackOnly vs ApplicationException rollback true

时间:2015-06-15 15:22:06

标签: java transactions java-ee-6

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

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

在我的例子中,我捕获了一个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
}

1 个答案:

答案 0 :(得分:2)

如果异常刚刚创建并抛出,则异常不会导致异常。必须从其中一个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块的异常,或者明确地将事务标记为rollbackOnly。