我有一个方法,该方法会引发回滚为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
}
如果将异常抛出并捕获到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。