Как работают транзакции с savepoints?

SAVEPOINT позволяет создать промежуточную точку внутри транзакции, к которой можно откатиться без полного ROLLBACK. Это полезно, когда нужно отменить только часть операций, сохранив уже выполненные изменения в текущей транзакции.
Подробный ответ

Что такое savepoint

SAVEPOINT — это имя промежуточной точки внутри транзакции. Если что-то пошло не так, можно откатиться не ко всей транзакции, а только к этому месту.

Как это выглядит

BEGIN;

INSERT INTO orders (id, user_id, total)
VALUES (1, 10, 100);

SAVEPOINT after_order;

INSERT INTO order_items (order_id, product_id, qty)
VALUES (1, 5, 2);

ROLLBACK TO SAVEPOINT after_order;

COMMIT;

В этом примере первая вставка сохранится, а вторая будет отменена, потому что мы откатились к after_order.

Когда это полезно

  • когда в одной транзакции есть несколько независимых шагов;

  • когда нужно попробовать рискованную операцию и при ошибке отменить только её;

  • когда импорт данных должен продолжаться, даже если одна часть строки не прошла валидацию;

  • когда приложение реализует частичный откат сложного бизнес-процесса.

Ограничения

Savepoint не заменяет полноценную транзакционную логику. Он помогает только внутри уже открытой транзакции и не решает проблемы плохого проектирования бизнес-процесса.

Как ответить на собеседовании

Savepoint — это промежуточная точка внутри транзакции. Я могу сделать ROLLBACK TO SAVEPOINT, чтобы отменить только часть операций, а потом продолжить транзакцию и сделать COMMIT. Это удобно для сложных сценариев, где нужен частичный откат.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге