Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Топовые новости
Новое

Инструкция ROLLBACK

Инструкция ROLLBACK возвращает транзакцию в ее исходное состояние или к определенной, заранее заданной точке сохранения (SAVEPOINT). Также инструкция ROLLBACK закрывает все открытые курсоры.


Синтаксис SQL 2003

ROLLBACK [WORK]
[AND [NO] CHAIN]
[TO SAVEPOINT точка_сохранения]


Ключевые слова

WORK

Дополнительное ключевое слово, которое по сути никакой роли не играет.

AND [NO] CHAIN

Инструкция AND CHAIN заставляет СУБД завершить текущую транзакцию, но среда транзакции (например, уровень изоляции транзакций) остается в общем пользовании для следующей транзакции. Предложение AND NO CHAIN просто завершает транзакцию (так система поступает и по умолчанию).

ТО SAVEPOINT имя_точки_сохранения

Позволяет не отменять всю транзакцию, а откатить ее к указанной точке сохранения (то есть выполняется частичный откат). Параметр имя_точки_сохранения может представлять собой постоянное выражение или переменную. Если нет активных точек сохранения, то инструкция возвратит ошибку. Если предложение ТО SAVEPOINT опущено, закрываются все курсоры. Если предложение ТО SAVEPOINT указано, то закрываются только те курсоры, которые были открыты соответствующей инструкцией SAVEPOINT.

Помимо отмены одиночных операций по манипуляции данными, таких, как INSERT, UPDATE или DELETE (или их пакета), инструкция ROLLBACK отменяет транзакции вплоть до последней поданной инструкции START TRANSACTION, SET TRANSACT/ON или SAVEPOINT.


Общие правила

Инструкция ROLLBACK используется для отмены транзакции. Ее можно применять для отмены транзакций, запускаемых явным образом (при помощи инструкции START TRAN) или неявно, при помощи инициирующей транзакцию инструкции. Также ее можно использовать для отмены неявных транзакций, запускаемых без инструкции START’TRAN. Инструкции ROLLBACK и COMMIT являются взаимоисключающими.

Большинство людей связывают с термином «транзакция» такие команды, как INSERT, UPDATE и DELETE. Однако транзакции включают в себя самые разнообразные команды. Список таких команд разный на разных платформах, но, как правило, сюда входят команды, которые изменяют данные и структуры базы данных и которые регистрируются механизмом ведения журнала базы. Согласно стандарту ANSI, при помощи инструкции ROLLBACK можно отменить любые инструкции SQL.


Советы и хитрости программирования

Наиболее важная хитрость состоит в том, что некоторые платформы выполняют автоматические и неявные транзакции, а другие требуют выполнения явных транзакций. Если вы сделаете допущение, что платформа использует один метод, а не другой, вы можете не угадать. Таким образом, при переносе кода с одной платформы на другую нужно следовать стандартному, определенному методу работы с транзакциями. Мы рекомендуем остановиться на явных транзакциях, где в ее начале используются инструкции SET TRAN или START TRAN а в конце — инструкции COMMIT или ROLLBACK.


DBS

Платформа DB2 поддерживает базовую форму инструкции стандарта ANSI. Не поддерживается предложение [AND [NO] CHAIN]. (Также обратите внимание, что DB2 не поддерживает инструкцию START TRANSACTION, поэтому все транзакции в DB2 запускаются неявно.) Синтаксис инструкции ROLLBACK в DB2 следующий.

ROLLBACK [WORK] [ТО SAVEPOINT имя_точки_сохранения]

Несколько инструкций SET в DB2 не охватываются системой контроля транзакций, и, следовательно, их нельзя откатить. Сюда входят следующие инструкции: SET CONNECTION, SET CURRENT DEFAULT TRANSFORM GROUP, SET CURRENT DEGREE, SET CURRENT EXPLAIN MODE, SET CURRENT EXPLAIN SNA PSHOT, SET CURRENT PA CKA GESET, SET CURRENT QUERY OPTIMIZATION, SET CURRENT REFRESH AGE, SET EVENT MONITOR STATE, SETPASSTHRU, SET PATH, SET SCHEMA и SET SERVER OPTION.

Платформа DB2 выполняет неявный откат, если элемент задания завершается ошибкой.

При выполнении в DB2 обычного отката (не к точке сохранения) все блокировки, выполненные элементом задания, снимаются, все открытые курсоры закрываются, локаторы объектов LOB очищаются, и в некоторых случаях откат влияет на копирование. Если в DB2 выполняется откат к точке сохранения, то блокировки и локаторы объектов LOB остаются неизменными, и динамически созданный код SQL остается работоспособным (хотя его нужно будет обрабатывать заново). Откат к точке сохранения, при котором используются курсоры, несколько более сложен. Если в точке сохранения курсор зависит от кода DDL, он будет помечен как неработоспособный. Если ссылка на курсор в точке сохранения есть, но в точке сохранения он не зависит от DDL, тогда курсор остается открытым и указатель курсора помещается перед следующей строкой. Во всех прочих случаях курсор остается неизменным.


MySQL

Платформа MySQL поддерживает лишь самый простой механизм отката, и даже при этом вы должны объявлять каждую таблицу, применительно к которой вы можете выполнить инструкцию ROLLBACK как безопасную для транзакций (transaction safe). Безопасная для транзакций таблица — это таблица, объявленная со свойством InnoDB или BDB. За дополнительной информацией обращайтесь к разделу, посвященному инструкции CREATE TABLE.

ROLLBACK [ТО SAVEPOINT имя_точки_сохранения]

MySQL разрешает выполнять инструкции, связанные с управлением транзакциями, применительно к небезопасным таблицам, но эти инструкции просто игнорируются, и выполнение транзакций происходит автоматически. В случае использования инструкции ROLLBACK в небезопасной таблице откат изменений проводиться не будет.

По умолчанию MySQL работает в режиме AUTOCOMMIT, где все модификации данных автоматически записываются на диск. Вы можете отключить режим A UTOCOMMIT, подав команду SET’AUTOCOMMIT=0. Вы также можете контролировать автоматическое выполнение транзакций по одной инструкции, используя команду BEGIN и BEGIN WORK.

BEGIN;
SELECT @A:=SUM(salary)
FROM employee WHERE job_type=1;

BEGIN WORK;

UPDATE jobs SET summmary=@A
WHERE job_type=1;

COMMIT;

Платформа MySQL автоматически выполняет неявную инструкцию COMMIT по завершении любой из приведенных инструкций: ALTER TABLE, BEGIN, CREATE INDEX, DROP DATABASE, DROP TABLE, RENAME TABLE и TRUNCATE.

MySQL поддерживает частичный откат с использованием точек сохранения начиная с версии 4.0.14.


Oracle

Oracle поддерживает ANSI форму инструкции ROLLBACK с дополнительным предложением FORCE.

ROLLBACK [WORK] {[ТО [SAVEPOINT] имя_точки_сохранения] | [FORCE текст]};

Инструкция ROLLBAСК удаляет все модификации данных, внесенные в текущей открытой транзакции (или после указанной существующей точки восстановления). Также снимаются все блокировки, используемые транзакцией, очищаются все точки сохранения, отменяются все изменения текущей транзакции, и транзакция завершается.

Инструкция ROLLBACK…ТО SAVEPOINT производит откат части транзакции, идущей после точки сохранения. За дополнительной информацией обращайтесь к разделу «Инструкция SAVEPOINT».

Реализация инструкции ROLLBACK в Oracle близка к стандарту ANSI, за исключением предложения FORCE. Инструкция ROLLBACK FORCE отменяет сомнительную распределенную транзакцию. Чтобы выполнить эту инструкцию, вы должны иметь привилегию FORCE TRANSACTION. Предложение FORCE нельзя использовать с предложением ТО [SAVEPOINT]. Инструкция ROLLBACK FORCE может влиять не на текущую транзакцию, а на транзакцию, указанную в параметре ‘текст’. Параметр ‘текст’ должен представлять собой локальный или глобальный ID транзакции, которую вы хотите отменить. (Такие транзакции и их ID подробно описаны в системном представлении Oracle DBA_2PC_PENDING.)

Например, вам может понадобиться вернуть вашу текущую транзакцию к точке сохранения salary_adjustment. Две приведенные ниже команды эквивалентны.

ROLLBACK WORK ТО SAVEPOINT salary_adjustment; ROLLBACK TO salary_adjustment;

В следующем примере мы откатываем сомнительную распределенную транзакцию.

ROLLBACK FORCE ‘45.52.67’



PostgreSQL

Платформа PostgreSQL поддерживает базовую форму инструкции ROLLBA СК, но не поддерживает точки сохранения.



PostgreSQL

{ROLLBACK | ABORT} [WORK | TRANSACTION];

Инструкция ROLLBA СК удаляет все модификации данных, внесенные в текущей открытой транзакции. Если открытые транзакции отсутствуют, инструкция генерирует ошибку. PostgreSQL поддерживает как предложение WORK, так и предложение TRANSA CTION, Не поддерживается откат к точке сохранения. Платформа PostgreSQL поддерживает ключевое слово ABORT как синоним ROLLBACK.


SQL Server

Платформа SQL Server поддерживает ключевые слова WORK и TRAN. Единственное различие между ними состоит в том, что инструкция ROLLBACK WORK не позволяет откатывать указанную транзакцию к указанной точке сохранения.

ROLLBACK {[WORK] | [TRANSACTION] [имя_транзакции имя_точки_сохранения]]}

Если инструкция ROLLBACK используется без ключевых слов WORK или TRAN, то она отменяет все открытые в данный момент транзакции. Инструкция ROLLBACK, как правило, отключает блокировку, но блокировки не снимаются, если происходит откат к точке сохранения.

SQL Server позволяет указывать помимо имени_точки_сохранения конкретное имя_транзакции. Вы можете указывать их напрямую или при помощи переменных в коде Transact-SQL.

Если инструкция ROLLBACK TRANSACTION выполняется в триггере, она отменяет все модификации данных, включая те, которые произвел триггер, до момента подачи инструкции ROLLBACK. Вложенные триггеры не выполняются, если они идут в тексте триггера после инструкции ROLLBACK. Однако на инструкции, которые идут в триггере после ROLLBACK, эта инструкция не влияет. Команда ROLLBACK сходна с инструкцией COMMIT в плане вложенности, установки в ноль системной переменной @TRANSCOUNT (за дополнительной информацией о контроле транзакций во вложенном триггере SQL Server обращайтесь к разделу «Инструкция СОММIТ»).

Ниже приводится пакет Transact-SQL, использующий инструкции COMMIT и ROLLBACK на Microsoft SQL Server. В этом примере в таблицу sales вставляется запись. Если при вставке возникает ошибка, происходит откат транзакции. Если вставка проходит успешно, транзакция фиксируется.

// инициализация транзакции
BEGIN TRAN;

// сама транзакция
INSERT INTO sales
VALUES (‘7896’, ‘JR3435’, ‘Oct 28 1997’, 25, ‘Net 60’, ‘BU7832’);

Источник