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;Связанные термины
Анекдоты по теме
— Что такое eventual consistency? — Данные станут согласованными «в конечном счёте». — Когда это приемлемо? — Лайки в соцсетях, счётчики просмотров — небольшая задержка не критична. — Когда неприемлемо? — Банковские переводы, инвентарь товаров. Там нужен ACID. — Один размер не подходит всем. — В этом вся суть NoSQL vs SQL дискуссии.
— Что такое advisory locks? — Пользовательские блокировки вне транзакций. — Пример? — SELECT pg_advisory_lock(12345); — захватить блокировку с ID 12345. — Зачем? — Распределённые mutex: только один воркер обрабатывает задачу с ID 12345. — Как Redis SETNX, но в PostgreSQL. — Именно, без Redis.
— Что такое DDL транзакции? — В PostgreSQL DDL операции (CREATE, ALTER, DROP) транзакционны. — То есть можно откатить DROP TABLE? — Да! BEGIN; DROP TABLE users; ROLLBACK; — таблица цела. — В MySQL? — DDL делает implicit COMMIT. Откатить нельзя. — Это важное отличие.