ROLLBACK TRANSACTION (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure хранилище платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric

Эта инструкция откатывает явную или неявную транзакцию к началу транзакции или в точку сохранения внутри транзакции. Можно использовать ROLLBACK TRANSACTION для удаления всех изменений данных, внесенных с начала транзакции или в точку сохранения. Она также освобождает ресурсы, используемые транзакцией.

Откат транзакции не включает изменения, внесенные в локальные переменные или табличные переменные. Эти изменения не удаляются этим оператором.

Соглашения о синтаксисе Transact-SQL

Синтаксис

Синтаксис ДЛЯ SQL Server и База данных SQL Azure.

ROLLBACK { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable
    | savepoint_name | @savepoint_variable ]
[ ; ]

Синтаксис для хранилища данных Synapse в Microsoft Fabric, Azure Synapse Analytics и базе данных параллельного хранилища данных.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Аргументы

transaction_name

Имя, назначенное транзакции BEGIN TRANSACTION. Аргумент transaction_name должен соответствовать правилам для идентификаторов, однако используются только первые 32 символа имени транзакции. При вложенных транзакциях transaction_name должно быть именем из самой BEGIN TRANSACTION внешней инструкции. transaction_name всегда учитывает регистр, даже если экземпляр SQL Server не учитывает регистр.

@tran_name_variable

Имя определяемой пользователем переменной, содержащей допустимое имя транзакции. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar.

savepoint_name

savepoint_name из инструкцииSAVE TRANSACTION. Аргумент savepoint_name должен соответствовать требованиям, предъявляемым к идентификаторам. Используйте аргумент savepoint_name, если откат по условию должен влиять только на часть транзакции.

@savepoint_variable

Имя определяемой пользователем переменной, содержащей допустимое имя точки сохранения. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar.

Обработка ошибок

Оператор ROLLBACK TRANSACTION не создает сообщения пользователю. Если предупреждения необходимы в хранимых процедурах или триггерах, используйте RAISERROR инструкции или PRINT инструкции. RAISERROR — предпочтительная инструкция для указания ошибок.

Замечания

ROLLBACK TRANSACTIONбез savepoint_name или transaction_name откат к началу транзакции. При вложенных транзакциях этот же оператор откатывает все внутренние транзакции в самую внешнюю BEGIN TRANSACTION инструкцию. В обоих случаях ROLLBACK TRANSACTION системная @@TRANCOUNT функция уменьшается до 0. ROLLBACK TRANSACTION <savepoint_name> не уменьшается @@TRANCOUNT.

ROLLBACK TRANSACTION не может ссылаться на savepoint_name в распределенных транзакциях, запущенных явным образом BEGIN DISTRIBUTED TRANSACTION или перераспределиваемыми из локальной транзакции.

Транзакцию нельзя откатить после COMMIT TRANSACTION выполнения инструкции, за исключением случаев, когда COMMIT TRANSACTION она связана с вложенной транзакцией, содержащейся в откате транзакции. В этом случае вложенные транзакции откатываются, даже если вы выпустили COMMIT TRANSACTION для него.

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

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

В хранимых процедурах ROLLBACK TRANSACTION операторы без savepoint_name или transaction_name откатите все инструкции на внешний BEGIN TRANSACTION. Оператор ROLLBACK TRANSACTION в хранимой процедуре, которая вызывает @@TRANCOUNT другое значение, когда хранимая процедура завершается, чем @@TRANCOUNT значение при вызове хранимой процедуры, создает информационное сообщение. Это сообщение не влияет на последующую обработку.

ROLLBACK TRANSACTION Если триггер выдан в триггере:

  • Все изменения данных, сделанные к настоящему времени в текущей базе данных, откатываются, включая изменения, сделанные триггером.

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

  • Инструкции в пакете после запуска триггера не выполняются.

@@TRANCOUNT увеличивается по одному при вводе триггера, даже если в режиме автозаверждения. (Система обрабатывает триггер как неявную вложенную транзакцию.)

ROLLBACK TRANSACTION операторы в хранимых процедурах не влияют на последующие инструкции в пакете, вызываемом процедурой; последующие инструкции в пакете выполняются. ROLLBACK TRANSACTION операторы в триггерах завершают пакет, содержащий инструкцию, которая запустила триггер; последующие инструкции в пакете не выполняются.

Эффект курсора ROLLBACK определяется этими тремя правилами:

  • При CURSOR_CLOSE_ON_COMMIT выборе ON, ROLLBACK закрывается, но не освобождает все открытые курсоры.

  • При CURSOR_CLOSE_ON_COMMIT использовании набора ROLLBACK OFFне влияет на открытые синхронные или асинхронные курсоры или INSENSITIVE асинхронные STATIC STATIC курсоры, которые были полностью заполнены. Открытые курсоры любого другого типа закрываются, но не освобождаются.

  • Ошибка, которая уничтожает пакет и формирует внутренний откат, освобождает все курсоры, которые были объявлены в пакете, содержащем ошибочную инструкцию. Все курсоры освобождены независимо от их типа или параметра CURSOR_CLOSE_ON_COMMIT. Это относится и к курсорам, объявленным в хранимых процедурах, вызываемых ошибочным пакетом. Курсоры, объявленные в пакете перед пакетом ошибок, применяются к первым двум правилам. Ошибка взаимоблокировки является примером ошибки такого типа. Инструкция ROLLBACK , выданная в триггере, также автоматически создает этот тип ошибки.

Режим блокировки

Инструкция ROLLBACK TRANSACTION , указывающая savepoint_name освобождает все блокировки, приобретенные за пределами точки сохранения, за исключением эскалаций и преобразований. Эти блокировки не выпускаются, и они не преобразуются обратно в предыдущий режим блокировки.

Разрешения

Необходимо быть членом роли public.

Примеры

В следующем примере демонстрируется эффект отката именованной транзакции: После создания таблицы следующие инструкции запускают именованную транзакцию, вставляют две строки и откатывают транзакцию с именем в переменной @TransactionName. Другой оператор вне именованной транзакции вставляет две строки. Запрос возвращает результаты предыдущих инструкций.

USE tempdb;
GO

CREATE TABLE ValueTable ([value] INT);
GO

DECLARE @TransactionName VARCHAR(20) = 'Transaction1';

BEGIN TRANSACTION @TransactionName

INSERT INTO ValueTable
VALUES (1), (2);

ROLLBACK TRANSACTION @TransactionName;

INSERT INTO ValueTable
VALUES (3), (4);

SELECT [value]
FROM ValueTable;

DROP TABLE ValueTable;

Вот результирующий набор.

value
-----
3
4