Знал ли ты, что внутри транзакции можно создавать контрольные точки с помощью SAVEPOINT? Вместо сценария, где при ошибке теряется вся работа.
SAVEPOINT позволяет зафиксировать точку внутри транзакции, к которой можно откатиться. Обычный откат отменяет всю транзакцию, а откат к SAVEPOINT возвращает состояние только до этой точки.
SAVEPOINT — это как контрольные точки в трубопроводе. Если проблема возникает дальше по потоку, можно локализовать последствия, вернувшись к последней стабильной точке, не останавливая всю систему.
Следующий код откатывает всё:
BEGIN;
INSERT INTO orders VALUES (1, 'Laptop');
INSERT INTO payments VALUES (1, 'FAILED');
-- Здесь что-то пошло не так
ROLLBACK; -- Удалит И заказ, И платёж
Если добавить SAVEPOINT, можно откатиться только к последней контрольной точке:
BEGIN;
INSERT INTO orders VALUES (1, 'Laptop');
-- Создаём контрольную точку
SAVEPOINT before_payment;
INSERT INTO payments VALUES (1, 'FAILED');
-- Платёж не прошёл — откатываем только его
ROLLBACK TO SAVEPOINT before_payment;
-- Пробуем альтернативный способ оплаты
INSERT INTO payments VALUES (1, 'SUCCESS');
COMMIT;
SAVEPOINT полезен, когда стоимость полного отката слишком высокая и выгоднее переиграть только часть транзакции. Даёт более гибкое управление транзакциями, особенно в сложных сценариях.
SAVEPOINT не устраняет ошибку, а ограничивает её последствия.
👉 @SQLPortal
