Транзакции JDBC
По умолчанию каждая команда фиксируется отдельно
Новое JDBC-соединение обычно работает в режиме auto-commit: после успешного выполнения каждая SQL-команда сразу становится отдельной зафиксированной транзакцией. Для независимых изменений это удобно, но несколько связанных шагов тогда могут завершиться лишь частично.
Представь перевод денег: уменьшить баланс одного счёта и увеличить баланс другого нужно как единую операцию. Если первая команда уже зафиксирована, а вторая упала, данные окажутся в промежуточном состоянии.
Отключаем auto-commit и управляем границей сами
connection.setAutoCommit(false);
try {
debit.executeUpdate();
credit.executeUpdate();
connection.commit();
} catch (SQLException e) {
connection.rollback();
throw e;
}
После setAutoCommit(false) изменения не фиксируются после каждой команды автоматически.
commit() подтверждает накопленные изменения,
а rollback() отменяет изменения текущей транзакции.
Транзакция привязана к Connection
Команды участвуют в одной JDBC-транзакции потому, что выполняются через одно и то же соединение.
Если две связанные команды отправить через разные Connection,
обычный commit() одного из них не управляет вторым.