SAVEPOINT
Точка сохранения внутри транзакции. Позволяет откатиться к ней, не отменяя всю транзакцию.
SAVEPOINT point_name; ROLLBACK TO point_name; RELEASE SAVEPOINT point_name;
Объяснение
Пример
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;Связанные термины
Анекдоты по теме
— Почему разработчики боятся слова TRUNCATE? — Потому что DELETE можно откатить, если ты в транзакции. А TRUNCATE — это как ядерная бомба. Быстро, чисто, и все данные — в ядерную зиму.
— Что такое freeze в PostgreSQL? — PostgreSQL использует 32-bit transaction ID (XID). После ~2 миллиардов транзакций — wraparound. — Что происходит? — Старые строки могут «исчезнуть». База уходит в read-only для безопасности. — VACUUM FREEZE? — Помечает строки как «вечные», освобождая XID пространство. — autovacuum следит за этим.
— Что такое WAL? — Write-Ahead Log. Журнал изменений. — Зачем? — Перед изменением данных — запись в WAL. При сбое — восстановление из WAL. — Это медленно? — WAL пишется последовательно — это быстро. Сами данные — позже. — Репликация тоже через WAL? — Да. Replica читает WAL с primary.