Java Connection.close是否回滚?

Java Connection.close是否回滚?,java,transactions,database-connection,Java,Transactions,Database Connection,Java Connection.close是否回滚到finally块 我知道.Net SqlConnection.close可以做到这一点 有了这个,我可以尝试/最终不被捕获地阻塞 例如: try { conn.setAutoCommit(false); ResultSet rs = executeQuery(conn, ...); .... executeNonQuery(conn, ...); .... conn.commit(); } fi

Java Connection.close是否回滚到finally块

我知道.Net SqlConnection.close可以做到这一点

有了这个,我可以尝试/最终不被捕获地阻塞

例如:

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

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

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

如果您打算编写多平台JDBC代码,则不应依赖此行为。

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

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

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

在finally块中回滚是无用的。在您提交之后,并且提交成功,为什么要回滚?所以如果我是你,我会在接球区打滚

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

神谕 在使用打开的事务关闭连接时提交事务(如@Mr.shinny and New)安宇 声明

SQL Server

在事务的中间调用关闭方法导致 要回滚的事务


对于MySQL JDBC,如果在关闭连接时没有调用提交或回滚方法,则实现将回滚连接。

如果我没有弄错,SQL Server将对此进行投诉。这不是无用的。如果在提交()之前发生异常但是在当前事务中成功执行之后,您很可能希望在退出具有连接访问权限的块之前回滚该事务。