Java Connection.close是否会回滚到finally块?。
我知道.Net SqlConnection.close可以做到。
有了这个,我可以在没有捕获的情况下制作try / finally块...
示例:
try {
conn.setAutoCommit(false);
ResultSet rs = executeQuery(conn, ...);
....
executeNonQuery(conn, ...);
....
conn.commit();
} finally {
conn.close();
}
答案 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)
不同数据库之间的行为完全不同。例子:
在使用开放交易关闭连接时提交交易(如@Mr.Shiny和New安宇所述。
在事务中间调用close方法会导致 要回滚的交易。
答案 4 :(得分:0)
在finally块中回滚是没用的。提交后,提交成功,为什么要回滚?所以如果我是你,我会在catch块中回滚。
答案 5 :(得分:0)
对于MySQL JDBC,如果在没有调用commit或rollback方法的情况下关闭,实现将回滚连接。