SAVEPOINT в PostgreSQL: установка точки сохранения

Оператор SAVEPOINT в PostgreSQL позволяет создавать точки сохранения внутри транзакции, к которым можно частично откатываться без завершения всей транзакции. Это полезно для управления сложными операциями, где может потребоваться откат только части внесенных изменений.

Основы оператора SAVEPOINT

Базовый синтаксис:

SAVEPOINT savepoint_name;

Откат к точке сохранения выполняется с помощью ROLLBACK TO:

ROLLBACK TO savepoint_name;

Удаление точки сохранения без отката:

RELEASE SAVEPOINT savepoint_name;

Использование SAVEPOINT в транзакции

Пример транзакции с точками сохранения:

BEGIN;
INSERT INTO orders (customer, amount) VALUES ('Иван', 100);
SAVEPOINT sp1;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
ROLLBACK TO sp1;
COMMIT;

В этом случае вставка данных в orders сохранится, а изменение баланса будет отменено.

Вложенные точки сохранения

Можно создавать несколько точек сохранения и откатываться к любой из них:

BEGIN;
SAVEPOINT sp1;
INSERT INTO users (name) VALUES ('Алексей');
SAVEPOINT sp2;
UPDATE users SET name = 'Александр' WHERE name = 'Алексей';
ROLLBACK TO sp1;
COMMIT;

После отката к sp1 запись в users будет удалена, а все последующие изменения также отменятся.

Удаление точки сохранения

Если точка сохранения больше не нужна, её можно удалить с помощью RELEASE SAVEPOINT:

RELEASE SAVEPOINT sp1;

После этого sp1 больше не будет доступна для отката.