如果 java.sql.Connection#commit() 引发异常,是否需要回滚?

2022-09-02 20:51:24

根据JAVA文档,可以抛出.我的问题是,在这种情况下是否仍应发出回滚。Connection#commit()SQLException

例如:

Connection con = null;
try {
    // assume this method returns an opened connection with setAutoCommit(false)
    con = createConnection(); 

    // do DB stuff

    con.commit();
} catch (SQLException e) {
    if (con != null) {
        // what if con.commit() failed, is this still necessary,
        // will it hurt anything?
        con.rollback();
    }
} finally {
    if (con != null) {
        con.close();
    }
}

我实际上将con.rollback()调用包装到另一个方法中,该方法忽略了它引发的任何异常,所以我认为我在这里没问题。我只是想知道这是否是处理事情的最佳方式。


答案 1

即使提交失败,回滚也很重要,根据 Java 1.6 JDBC 文档

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

这意味着,如果不显式调用回滚,某些 JDBC 实现可能会在关闭连接之前调用 commit。

回滚的另一个很好的理由是Xepoch的建议,当使用连接池时,它甚至更重要。从连接池获取连接时,大多数实现将在提供连接之前执行,并根据 JavaDocs:connection.setAutoCommit(defaultAutoCommit)

如果在事务期间调用此方法并且更改了自动提交模式,则提交事务

如果抛出一个异常 - 那么这是一个棘手的...connection.rollback()


答案 2

我会做显式回滚,只是为了清理目的。尽管更改不会以任何一种方式保留在数据库中,但明确让数据库知道您已完成此操作似乎很不错。就像显式关闭连接的方式一样,无需等待对连接对象进行垃圾回收。

显然,这不是一个技术性的答案,我也有兴趣了解这样做是否有实际意义。


推荐