Перейти к основному содержимому

ROLLBACK TO SAVEPOINT

примечание

Эта страница переведена при помощи нейросети GigaChat.

ROLLBACK TO SAVEPOINT - откат к точке сохранения.

Синтаксис

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

Описание

Команда ROLLBACK TO SAVEPOINT откатывает все команды, выполненные после создания указанной точки сохранения, и начинает новую подтранзакцию на том же уровне транзакции. При этом сама точка сохранения остается действительной и к ней можно будет вернуться снова при необходимости.

Выполнение ROLLBACK TO SAVEPOINT автоматически уничтожает все точки сохранения, созданные после указанной.

Параметры

savepoint_name
Точка сохранения для отката.

Примечания

Используйте RELEASE SAVEPOINT, чтобы уничтожить точку сохранения без отмены эффектов команд, выполненных после ее создания.

Если указать несуществующее имя точки сохранения, будет сгенерирована ошибка.

Курсоры имеют несколько нетранзакционное поведение относительно точек сохранения. Любой курсор, открытый внутри точки сохранения, будет закрыт при откате этой точки. Если курсор был открыт до точки сохранения, но внутри нее выполнялись команды FETCH или MOVE, то при откате курсор останется на той позиции, на которой остановился после FETCH — перемещение по курсору не откатывается. Закрытие курсора также не отменяется путем отката. Но другие побочные эффекты, вызванные запросом курсора (такие как побочные эффекты нестабильных функций, вызываемых запросом), отменяются, если они происходят во время точки сохранения, которая впоследствии отменяется. Курсор, выполнение которого приводит к прерыванию транзакции, переходит в состояние невозможности выполнения и, хотя транзакцию можно восстановить с помощью ROLLBACK TO SAVEPOINT, использовать этот курсор дальше уже нельзя.

Примеры

Чтобы отменить эффекты команд, выполненных после того, как была установлена точка сохранения my_savepoint:

ROLLBACK TO SAVEPOINT my_savepoint;

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

BEGIN;

DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;

SAVEPOINT foo;

FETCH 1 FROM foo;
?column?
----------
1

ROLLBACK TO SAVEPOINT foo;

FETCH 1 FROM foo;
?column?
----------
2

COMMIT;

Совместимость

По стандарту SQL обязательным является ключевое слово SAVEPOINT в команде ROLLBACK TO SAVEPOINT, но PostgreSQL (как и Oracle) позволяет его опускать.

Стандарт SQL разрешает только слово WORK после ROLLBACK, а PostgreSQL также разрешает TRANSACTION (это не влияет на выполнение). SQL-стандарт также допускает дополнительную конструкцию AND [NO] CHAIN, но PostgreSQL в данный момент ее не поддерживает. В остальном команда соответствует стандарту SQL.

Смотрите также

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, SAVEPOINT