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)
如果异常在 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。