Транзакции JDBC

Базовый Java
≈ 1 мин чтения

По умолчанию каждая команда фиксируется отдельно

Новое 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() одного из них не управляет вторым.

Rollback должен быть частью обработки ошибки. Если после отключения auto-commit одна из связанных операций падает, нельзя просто выйти из метода и надеяться, что состояние соединения само станет правильным.