ТранзакцииПродвинутый
SAVEPOINT
Точка сохранения внутри транзакции. Позволяет откатиться к ней, не отменяя всю транзакцию.
Синтаксис
SAVEPOINT point_name; ROLLBACK TO point_name; RELEASE SAVEPOINT point_name;
Объяснение
SAVEPOINT создаёт промежуточную точку в транзакции. ROLLBACK TO savepoint_name откатывает только изменения после точки. RELEASE SAVEPOINT удаляет точку.
Пример
BEGIN;
INSERT INTO orders (user_id, total) VALUES (1, 500);
SAVEPOINT after_order;
INSERT INTO payments (order_id, amount) VALUES (currval('orders_id_seq'), 500);
-- Если ошибка в платеже:
ROLLBACK TO after_order;
-- Заказ сохранён, платёж откачен
COMMIT;Связанные термины
Анекдоты по теме
— Что такое UNLOGGED TABLE? — Таблица без WAL (Write-Ahead Log). — Быстрее обычной? — В 5–10 раз на INSERT. — В чём подвох? — При сбое данные теряются. Не реплицируется. — Когда использовать? — Кэш, временные данные, staging для ETL.
— Что такое «фантомное чтение»? — Запускаешь SELECT дважды в транзакции, второй раз видишь новые строки. — Почему? — Другая транзакция вставила и закоммитила строки между двумя твоими SELECT. — Как избежать? — REPEATABLE READ или SERIALIZABLE.
— Что делать, если случайно запустил DELETE без WHERE? — Плакать. Если повезёт и была транзакция — сделать ROLLBACK. Если не повезло — доставать бэкап.