我必須在一個函數中修改幾個表。他們必須全部成功,否則全部失敗。如果一個操作失敗,我希望他們都失敗。我有以下幾點:我們什麼時候需要調用java.sql.Connection.rollback()?
public void foo() throws Exception {
Connection conn = null;
try {
conn = ...;
conn.setAutoCommit(false);
grok(conn);
conn.commit();
}
catch (Exception ex) {
// do I need to call conn.rollback() here?
}
finally {
if (conn != null) {
conn.close();
conn = null;
}
}
}
private void grok(Connection conn) throws Exception {
PreparedStatement stmt = null;
try {
// modify table "apple"
stmt = conn.prepareStatement(...);
stmt.executeUpdate();
stmt.close();
// modify table "orange"
stmt = conn.prepareStatement(...);
stmt.executeUpdate();
stmt.close();
...
}
finally {
if (stmt != null) {
stmt.close();
}
}
}
我想知道如果我需要調用rollback()的情況下,在這個過程中出現問題的情況。
其他信息:我正在使用連接池。在上面的示例中,我還確保使用finally語句關閉每個PreparedStatement,爲簡潔起見,僅僅是省略了。
謝謝
確定更新以反映conn的例子可以是零,所以即使在更新我仍然不需要調用rollback()?謝謝 – user291701 2012-03-28 13:07:16
正確,你不需要調用回滾。你之前的例子,'conn'在'try'之前被初始化好了 – 2012-03-28 14:13:05
這是不正確的。您必須在連接上調用回滾以進行回滾更改。他們不會自動回滾給你。看到我的答案,但很容易通過在調用commit之前拋出異常來測試自己。 – 2017-05-21 19:24:43