Мне нужно изменить несколько таблиц в одной функции. Они все должны преуспеть, или все провалится. Если одна операция не удалась, я хочу, чтобы все они потерпели неудачу. У меня есть следующее:Когда нам нужно вызвать 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();
}
}
}
Я интересно, если мне нужно вызвать откат() в том случае, если что-то пойдет не так во время этого процесса.
Дополнительная информация: Я использую пул соединений. В вышеприведенном примере я также должен закрыть каждое PreparedStatement, используя также окончательные утверждения, просто оставшиеся для краткости.
Спасибо
ОК обновил пример, чтобы отразить, что сопп может быть нулевым, так что даже с обновлениями я по-прежнему не нужно вызывать rollback()? Спасибо – user291701
Правильно, вам не нужно вызывать откат. Ваш предыдущий пример, где 'conn' был инициализирован до того, как' try' был лучше –
Это просто неправда. Вы ДОЛЖНЫ вызывать откат в соединении для ваших изменений для отката. Они не будут автоматически откатываться за вас. См. Мой ответ, но его легко проверить для себя, выбросив исключение перед вызовом commit. –