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 является обязательным,
но QHB и Oracle позволяют его опустить. Стандарт SQL допускает в
качестве пропускаемого слова после ROLLBACK
только WORK, но не TRANSACTION.
Кроме того, в стандарте SQL есть необязательное предложение AND [ NO ] CHAIN,
которое в настоящее время не поддерживается QHB. В остальном эта
команда соответствует стандарту SQL.