【问题标题】:Handling Runtime exceptions in transactional jdbc code处理事务性 jdbc 代码中的运行时异常
【发布时间】:2011-08-23 19:28:17
【问题描述】:

我和一位同事在处理事务 JDBC 代码引发的运行时异常的最佳实践方面存在分歧。他认为捕捉Exception 而不是SQLException 是正确的做法。

他的论点是Connection.close(); 在事务尚未提交的情况下具有未定义的行为。一些 JDBC 实现可能会进行回滚,而另一些可能会进行提交。如果您只是捕获SQLException,那么任何运行时异常都会在finally 块中的close() 上具有未定义的行为。

目前是否认为捕获Exception 是最佳做法,如果不是,您如何解决他描述的情况?

Connection connection = null;
try {
    connection = ...
    // transactional code
} catch (final Exception e) {
    connection.rollback();
} finally {
    // close other resources
    if (connection != null) { connection.close(); }
}

【问题讨论】:

    标签: exception jdbc transactions


    【解决方案1】:

    我也会捕获 Exception 甚至 Throwable。这一切都取决于你的代码块内的代码。

    例如:

    如果您调用另一个 DAO 来持久化另一个实体,您肯定会捕获任何类型的异常以确保回滚您的 trx。

    您必须问自己这个问题:即使发生一些非 SQLException,我是否要提交 trx?

    根据我的经验,我的答案是否定的! ;-)

    但那只是我。

    问候

    【讨论】:

      【解决方案2】:

      根据 java.sql.Connection 的 Javadoc,关闭的行为取决于实现。

      强烈建议应用程序明确 在调用之前提交或回滚活动事务 close 方法。如果调用了close 方法 并且有一个活动的事务,结果是实现定义的。

      它可以安全地捕获并根据业务需求决定提交/回滚

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-03
        • 1970-01-01
        • 2013-04-15
        • 2017-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多