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