SAVEPOINT
SAVEPOINT — определить новую точку сохранения в текущей транзакции
Синтаксис
SAVEPOINT имя_точки_сохранения
Описание
SAVEPOINT
устанавливает новую точку сохранения в текущей транзакции.
Точка сохранения — это специальная отметка внутри транзакции, которая позволяет откатить все команды, выполненные после неё, и восстановить таким образом состояние на момент установки этой точки.
Параметры
имя_точки_сохранения
Имя, назначаемое новой точке сохранения. Ранее существующая точка с таким именем оказывается недоступной, пока не будут освобождены установленные позже одноимённые точки.
Примечания
Для отката к установленной точке сохранения предназначена команда ROLLBACK TO
. Чтобы уничтожить точку сохранения, сохраняя изменения, произведённые после того, как она была установлена, применяется команда RELEASE SAVEPOINT
.
Точки сохранения могут быть установлены только внутри блока транзакции. В одной транзакции можно определить несколько точек сохранения.
Примеры
Установление точки сохранения и затем отмена действия всех команд, выполненных после установленной точки:
BEGIN; INSERT INTO table1 VALUES (1); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (2); ROLLBACK TO SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (3); COMMIT;
Показанная транзакция вставит в таблицу значения 1 и 3, но не 2.
Этот пример показывает, как установить и затем уничтожить точку сохранения:
BEGIN; INSERT INTO table1 VALUES (3); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (4); RELEASE SAVEPOINT my_savepoint; COMMIT;
Данная транзакция вставит значения 3 и 4.
Этот пример показывает, как использовать точки сохранения с одним именем:
BEGIN; INSERT INTO table1 VALUES (1); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (2); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (3); -- откат ко второй точке сохранения ROLLBACK TO SAVEPOINT my_savepoint; SELECT * FROM table1; -- вывод строк 1 и 2 -- освобождение второй точки сохранения RELEASE SAVEPOINT my_savepoint; -- откат к первой точке сохранения ROLLBACK TO SAVEPOINT my_savepoint; SELECT * FROM table1; -- вывод только строки 1 COMMIT;
Данная транзакция сначала откатит строку 3, затем строку 2.
Совместимость
Стандарт SQL требует, чтобы точка сохранения уничтожалась автоматически, когда устанавливается другая точка сохранения с тем же именем. В PostgreSQL старая точка сохранения остаётся, хотя при откате или уничтожении будет выбираться только самая последняя. (После уничтожения последней точки командой RELEASE SAVEPOINT
доступной для команд ROLLBACK TO SAVEPOINT
и RELEASE SAVEPOINT
становится следующая.) В остальном оператор SAVEPOINT
полностью соответствует стандарту.