Окей, а что тогда делать, если мне нужно откатить только часть операций, а не всю транзакцию целиком?
Вот тут и начинается разговор про
SAVEPOINT.SAVEPOINT — это точка сохранения внутри текущей транзакции.Не новая транзакция.
Не отдельный независимый
COMMIT.Не «вложенная транзакция» в бытовом смысле.
Это просто метка, к которой можно откатиться, если что-то пошло не так.
Пример:
BEGIN;
INSERT INTO users(id, name) VALUES (1, 'Alice');
SAVEPOINT s1;
INSERT INTO orders(id, user_id) VALUES (10, 1);
-- что-то пошло не так
ROLLBACK TO SAVEPOINT s1;
COMMIT;
Что здесь произошло:
• пользователя вставили
• дошли до SAVEPOINT s1
• попробовали вставить заказ
• поняли, что дальше что-то сломалось
• откатились не всей транзакцией, а только до SAVEPOINT
То есть изменения до SAVEPOINT остались, а изменения после него откатились.
И вот тут очень важно не путать термины.
ROLLBACK TO SAVEPOINT — это не откат внутренней транзакции
Это частичный откат в рамках всё той же одной внешней транзакции
А значит:
•
COMMIT всё равно один — у внешней транзакции• граница
atomicity всё равно одна — у внешней транзакции•
SAVEPOINT не живёт отдельно и не фиксируется сам по себеПроще говоря:
нужен частичный откат внутри текущей логики — нужен SAVEPOINT
Честно признаюсь
SAVEPOINT я не юзал в проде, тыкал когда изучал SQL. Не могу прям советовать, мне кажется это для супер специфичных ситуаций и я бы его избегал всеми способами. Запомни его на случай собеса, если что флексанешь 🐺