17

Java Connection.close 是否回滚到 finally 块?

我知道 .Net SqlConnection.close 做到了。

有了这个,我可以在没有捕获的情况下进行 try/finally 块......

例子:

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

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

6 回答 6

28

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

于 2008-10-20T13:49:35.900 回答
10

在我使用过的任何数据库系统中,在提交后立即进行回滚是没有害处的,因此,如果您在 try 块中提交并在 finally 中回滚,事情就会被提交,而如果异常或提前返回导致错过的提交,回滚将回滚事务。所以安全的做法是

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

    conn.commit();
} finally {
   conn.rollback();
   conn.close();
}
于 2008-10-21T19:23:05.493 回答
6

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

于 2008-10-20T14:29:52.403 回答
6

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

甲骨文

当关闭与打开事务的连接时,事务被提交(正如@Mr. Shiny 和 New 安宇所说。

SQL 服务器

在事务中间调用 close 方法会导致事务回滚。

关闭方法(SQLServerConnection)

于 2013-02-28T12:15:13.997 回答
0

For MySQL JDBC, the implementation rolls back the connection if closed without a call to commit or rollback methods.

于 2014-08-02T00:45:06.137 回答
-1

在 finally 块中回滚是没有用的。提交之后,并且提交成功,为什么要回滚?所以如果我是你,我会在 catch 块中回滚。

于 2013-02-08T16:49:28.710 回答