【问题标题】:where should we use commit(session), in try or finally?我们应该在哪里使用 commit(session),在 try 还是 finally?
【发布时间】:2015-03-03 07:01:24
【问题描述】:

如果我想在成功执行数据库操作后使用 commit(session),将它放在 try 或 finally 块中哪个更好? 这里我终于用上了,应该在试试吗?

public void delete( --- ) {
    Session session = init();
    try {
        ----
    } catch (HibernateException e) {
        rollback(session);
        logger.error("delete failed", e);
        throw e;
    } finally {
        commit(session);
        close(session);
    }
}

【问题讨论】:

    标签: java hibernate exception try-catch


    【解决方案1】:

    应该在try,有两个原因:

    • 如果出现除HibernateException 之外的异常或错误其他,您将commit 会话,并且您几乎肯定不想这样做
    • 在拨打rollback 之后,您将拨打commit。我不记得 Hibernate 是否允许你这样做(通过默默地忽略回滚),但至少它是丑陋的。每个会话都应该提交回滚。

    这里的正常解决方案是保留一个单独的 boolean 变量,该变量在您成功提交时设置,并在 finally 中检查,必要时回滚:

    boolean committed = false;
    try {
        // Do stuff
        commit(session);
        committed = true;
    } catch (HibernateException e) {
        logger.error("delete failed", e);
        throw e;
    } finally {
        if (!committed) {
            rollback(session);
        }
        // TODO: This won't execute if rollback fails.
        // Check whether that's a problem.
        close(session);
    }
    

    【讨论】:

    • 感谢乔恩的详细回答。
    • 我认为你应该在 catch 块内移动回滚(没有提交标志)而不是使用提交标志,因为如果提交失败,则会抛出异常。
    • @AmjadAbdul-Ghani 不,因为如果抛出任何其他异常,它就不会回滚。如果提交失败,我至少希望它是有效的,然后调用回滚。
    • 这是真的,如果你没有正确处理异常,如果你曾经见过 spring 事务实现 catch throwable >> 如果需要重新抛出错误或异常,两者都可以工作,但我不不喜欢将回滚语句放在 finally 块中,这是我的偏好,感谢您的反馈
    • @Amjad:而我的偏好绝对是使用 finally 块,除非你正在捕捉 Throwable。否则泄漏交易太容易了,尽管是暂时的。 finally 块正是我们想要的那种清理。
    【解决方案2】:

    它应该在tryfinally 也会在 catch 之后调用。

    【讨论】:

      【解决方案3】:

      它绝对应该放在 try 块中。 finally 块通常只用于关闭任何连接。

      【讨论】:

      • 好吧,在这种情况下,IMO,如果会话尚未提交,finally 块也应该用于回滚。否则任何未处理的异常最终都会泄露这些会话。
      【解决方案4】:

      你需要把它放在 try 块中,否则你将无法识别任何错误并且你无法回滚

      【讨论】:

        猜你喜欢
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        相关资源
        最近更新 更多