【发布时间】:2011-03-10 19:11:03
【问题描述】:
假设你有以下代码:
Connection conn;
try
{
conn = ... // get connection
conn.setAutoCommit(false);
... // Do some modification queries and logic
conn.commit()
} catch(SQLException e)
{
conn.rollback() // Do we need this?
conn.close()
}
在这段代码中,如果出现异常,是关闭连接(因为自动提交已关闭)还是显式回滚然后关闭连接更好?没有存档点。
我觉得添加回滚调用可能有意义,因为:
1) 将来有人可能会添加保存点但忘记添加回滚
2) 提高可读性
3) 它不应该花费任何东西,对吧?
但显然,这些都不是特别引人注目。有什么标准做法吗?
注意:我知道在关闭和回滚时需要重复尝试/捕获。我实际上有一个中间件可以抽象数据库访问并处理它,但我想知道添加它是否是多余的。
【问题讨论】:
-
好问题。我对您的第三项的答案很感兴趣,因为我们过去总是在返回连接之前进行回滚,但有一次我们的 DBA 注意到了这一点,并且非常虔诚地声称回滚是昂贵的。我没有得到很好的动力,但我们让步了,基本上确保只有在需要时才调用 rollback()(这很容易,因为它只是代码中受影响的一个地方)。
-
有人能用 Java 7 try-with-resource 回答这个问题吗?这会简化必须编写的代码吗? (相关问题,但未说明如何结合使用 try-with-resource 和 autoCommit:stackoverflow.com/questions/8066501/…)