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中回滚,那么事情就会被提交,而如果是异常或者提前返回会导致提交被遗漏,回滚将回滚事务。所以安全的事情是

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top