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

dcp*_*dcp 17 java connection jdbc rollback

根据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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mos*_*sha 19

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

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

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

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

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

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


Nik*_*bak 6

我会为了清理目的而进行显式回滚.虽然db中的更改不会以任何方式保留,但显然让数据库知道你已经在这里完成了.就像您显式关闭连接的方式一样,无需等待垃圾收集的Connection对象.

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

  • 另外,在汇集连接的情况下,它将在下一次租赁中提供干净的连接而不是脏连接. (4认同)