А вы знали, что внутри transaction можно создавать контрольные точки с помощью
SAVEPOINT? Обычный ROLLBACK отменяет всю transaction. А 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;
Теперь можно откатить только неудачную часть transaction и продолжить работу с последней безопасной точки.
SAVEPOINT особенно полезен в сложных операциях, где полный откат и повторное выполнение всей transaction обходятся слишком дорого.
SAVEPOINT не предотвращает ошибку. Он просто помогает не откатывать всю работу из-за одной неудачной операции.👉 @SQLPortal
