Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureAzure Synapse Analytics
Система платформы аналитики (PDW)
Хранилище в Microsoft Fabric
База данных SQL в Microsoft Fabric
Эта инструкция откатывает явную или неявную транзакцию к началу транзакции или в точку сохранения внутри транзакции. Можно использовать ROLLBACK TRANSACTION для удаления всех изменений данных, внесенных с начала транзакции или в точку сохранения. Она также освобождает ресурсы, используемые транзакцией.
Откат транзакции не включает изменения, внесенные в локальные переменные или табличные переменные. Эти изменения не удаляются этим оператором.
Соглашения о синтаксисе Transact-SQL
Syntax
Синтаксис для SQL Server, базы данных SQL Azure и базы данных SQL Fabric.
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
Синтаксис для хранилища данных Fabric, Azure Synapse Analytics и базы данных параллельного хранилища данных.
ROLLBACK { TRAN | TRANSACTION }
[ ; ]
Arguments
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 — предпочтительная инструкция для указания ошибок.
Remarks
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.
Interoperability
В хранимых процедурах 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использовании набораOFFROLLBACKне влияет на открытые синхронные или асинхронные курсоры илиSTATICасинхронныеINSENSITIVESTATICкурсоры, которые были полностью заполнены. Открытые курсоры любого другого типа закрываются, но не освобождаются.Ошибка, которая уничтожает пакет и формирует внутренний откат, освобождает все курсоры, которые были объявлены в пакете, содержащем ошибочную инструкцию. Все курсоры освобождены независимо от их типа или параметра
CURSOR_CLOSE_ON_COMMIT. Это относится и к курсорам, объявленным в хранимых процедурах, вызываемых ошибочным пакетом. Курсоры, объявленные в пакете перед пакетом ошибок, применяются к первым двум правилам. Ошибка взаимоблокировки является примером ошибки такого типа. ИнструкцияROLLBACK, выданная в триггере, также автоматически создает этот тип ошибки.
Поведение блокировки
Инструкция ROLLBACK TRANSACTION , указывающая savepoint_name освобождает все блокировки, приобретенные за пределами точки сохранения, за исключением эскалаций и преобразований. Эти блокировки не выпускаются, и они не преобразуются обратно в предыдущий режим блокировки.
Permissions
Необходимо быть членом роли public.
Examples
В следующем примере демонстрируется эффект отката именованной транзакции: После создания таблицы следующие инструкции запускают именованную транзакцию, вставляют две строки и откатывают транзакцию с именем в переменной @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