EjbConetxt setRollbackOnly与ApplicationException rollback true

问题描述 投票:0回答:1

我有一个方法,该方法会引发回滚为true的应用程序异常。我想知道是否必须显式调用ejbContext.setRollbackOnly()吗?

文档here说,当异常标记为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
}
java transactions java-ee-6
1个回答
3
投票

如果将异常抛出并捕获到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块中,或将事务显式标记为rollbackOnly。

© www.soinside.com 2019 - 2024. All rights reserved.