ROLLBACK TRANSACTION (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)Warehouse in 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 }
[ ; ]

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

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 использовании набора ROLLBACKOFFне влияет на открытые синхронные или асинхронные курсоры или INSENSITIVE асинхронные STATICSTATIC курсоры, которые были полностью заполнены. Открытые курсоры любого другого типа закрываются, но не освобождаются.

  • Ошибка, которая уничтожает пакет и формирует внутренний откат, освобождает все курсоры, которые были объявлены в пакете, содержащем ошибочную инструкцию. Все курсоры освобождены независимо от их типа или параметра 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