【问题标题】:EjbConetxt setRollbackOnly vs ApplicationException rollback trueEjbConetxt setRollbackOnly 与 ApplicationException 回滚 true
【发布时间】:2020-01-31 12:51:55
【问题描述】:

我有一个方法会抛出应用程序异常且回滚为真。我想知道是否必须显式调用 ejbContext.setRollbackOnly()?

文档here 说,当异常标记为rollback=true 时,我们不需要调用EjbContext 的setRollbackOnly。

在我的例子中,我捕获了一个 ApplicationException,它的回滚属性设置为 true。然后我显式调用 ejbContext.setRollbackOnly() 因为我在 catch 块中抛出了另一个异常,这个异常将传播到客户端。下面是我的代码sn-p

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】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多