Что происходит с транзакцией в SQL при возникновении исключения?

«Что происходит с транзакцией в SQL при возникновении исключения?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При возникновении необработанного исключения во время выполнения SQL-транзакции происходит откат (ROLLBACK) всех изменений, сделанных в рамках этой транзакции, для сохранения целостности данных.

Почему это важно: Транзакция должна быть атомарной — либо выполняются все её операции, либо ни одной. Исключение нарушает этот принцип, поэтому система откатывается к состоянию до начала транзакции (BEGIN).

Практический пример:

BEGIN; -- Начало транзакции

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
-- Здесь может возникнуть исключение (например, нарушение ограничения)
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;

COMMIT; -- Фиксация изменений

Если исключение возникает после первого UPDATE, второй не выполняется, а изменения из первого автоматически откатываются. Без этого механизма баланс пользователя 1 уменьшился бы, а пользователь 2 не получил бы деньги, что привело бы к потере данных.

Лучшие практики:

  • Используйте явный ROLLBACK в блоках CATCH/EXCEPTION.
  • Настройте уровень изоляции транзакции в зависимости от требований.
  • Обрабатывайте исключения на уровне приложения для принятия решения о повторе или откате.