ROLLBACK TO SAVEPOINT
ROLLBACK TO SAVEPOINT — откатиться к точке сохранения
Синтаксис
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] имя_точки_сохранения
Описание
Откатывает все команды, выполненные после установления точки сохранения, и начинает новую подтранзакцию на том же уровне транзакции. Точка сохранения остаётся действующей и при необходимости можно снова откатиться к ней позже.
ROLLBACK TO SAVEPOINT
неявно уничтожает все точки сохранения, установленные после заданной точки.
Параметры
имя_точки_сохранения
Точка сохранения, к которой нужно откатиться.
Примечания
Чтобы уничтожить точку сохранения, не отменяя действия команд, выполненных после неё, применяется команда RELEASE SAVEPOINT
.
Указание имени точки сохранения, не установленной ранее, считается ошибкой.
Курсоры проявляют не совсем транзакционное поведение применительно к точкам сохранения. Любой курсор, открытый внутри точки сохранения, будет закрыт при откате к этой точке. Если ранее открытый курсор был перемещён командой FETCH
или MOVE
внутри точки сохранения, к которой затем произошёл откат, курсор остаётся в той позиции, в которой он остался после FETCH
(то есть, перемещение курсора, производимое командой 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
является обязательным, но PostgreSQL и Oracle позволяют опускать его. SQL допускает WORK
, но не TRANSACTION
, в качестве избыточного слова после ROLLBACK
. Кроме того, в SQL есть дополнительное предложение AND [ NO ] CHAIN
, которое в настоящее время не поддерживается в PostgreSQL. В остальном эта команда соответствует стандарту SQL.