I have to modify a few tables in one function. They must all succeed, or all fail. If one operation fails, I want them all to fail. I have the following:
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();
}
}
}
I’m wondering if I need to call rollback() in the case that something goes wrong during this process.
Other info: I’m using connection pooling. In the sample above, I’m also making sure to close each PreparedStatement using finally statements as well, just left out for brevity.
Thank you
You don’t need to call
rollback(). If the connection closes without completingcommit()it will be rolled back.You don’t need to set
conntonulleither; and since thetryblock starts afterconnis initialized (assuming...cannot evaluate to null) you don’t need the!= nullinfinallyeither.