Java Connection.close是否会回滚?

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

我知道.Net SqlConnection.close可以做到。

有了这个,我可以在没有捕获的情况下制作try / finally块…

例:

try { conn.setAutoCommit(false); ResultSet rs = executeQuery(conn, ...); .... executeNonQuery(conn, ...); .... conn.commit(); } finally { conn.close(); } 

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

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

 try { conn.setAutoCommit(false); ResultSet rs = executeQuery(conn, ...); .... executeNonQuery(conn, ...); .... conn.commit(); } finally { conn.rollback(); conn.close(); } 

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

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

神谕

在使用开放事务关闭连接时提交事务(如@Mr.Shiny和New安宇所述。

SQL Server

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

close方法(SQLServerConnection)

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

对于MySQL JDBC,如果在没有调用commit或rollback方法的情况下关闭,则实现将回滚连接。