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.