EjbConetxt setRollbackOnly 与 ApplicationException 回滚 true
EjbConetxt setRollbackOnly vs ApplicationException rollback 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。
我有一个方法可以抛出回滚为真的应用程序异常。我想知道我是否必须显式调用 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。