Java Connection.close是否会回滚?

时间:2008-10-20 13:07:06

标签: java transactions database-connection

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

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

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

示例:

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

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

6 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:6)

Oracle's JDBC driver commits on close() by default.如果您打算编写多平台JDBC代码,则不应该依赖此行为。

答案 3 :(得分:5)

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

的Oracle

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

SQL Server

  

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

close Method (SQLServerConnection)

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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