English 中文(简体)
Java Connection.close会回滚吗?
原标题:
  • 时间:2008-10-20 13:07:05
  •  标签:

Java的Connection.close是否会在finally块中进行回滚?

我知道 .Net 的 SqlConnection.close 完成了这个操作。

这样我就可以创建try/finally块而不需要catch。

例子:

try {
    conn.setAutoCommit(false);
    ResultSet rs = executeQuery(conn, ...);
    ....
    executeNonQuery(conn, ...);
    ....

    conn.commit();
} finally {
   conn.close();
}
最佳回答

根据javadoc,在调用close方法之前,您应该尝试提交或回滚。否则的结果是由实现定义的。

问题回答

在我使用的任何数据库系统中,即使在提交后进行回滚也不会有任何损害。因此,如果在try块中提交,并在finally中回滚,事务将提交。而如果发生异常或早期返回导致提交被忽略,则回滚将回滚事务。因此,安全的做法是

try {
    conn.setAutoCommit(false);
    ResultSet rs = executeQuery(conn, ...);
    ....
    executeNonQuery(conn, ...);
    ....

    conn.commit();
} finally {
   conn.rollback();
   conn.close();
}

Oracle的JDBC驱动程序默认在close()上提交。 如果您打算编写多平台JDBC代码,则不应依赖此行为。

行为在不同数据库之间完全不同。例子:

Oracle

当使用具有打开事务的连接关闭连接时,事务将被提交。

SQL Server

Calling the close method in the middle of a transaction causes the transaction to be rolled back.

关闭方法(SQLServerConnection)

对于MySQL JDBC,如果关闭而没有调用commit或rollback方法,实现将回滚连接。

在finally块中回滚是无用的。一旦您提交并且提交成功,为什么要回滚?所以如果我是你,我会在catch块中回滚。





相关问题
热门标签