Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureAzure Synapse Analytics
Система платформы аналитики (PDW)
Хранилище в Microsoft Fabric
База данных SQL в Microsoft Fabric
Эта инструкция откатывает явную или неявную транзакцию к началу транзакции или в точку сохранения внутри транзакции. Вы используете ROLLBACK TRANSACTION для удаления всех изменений данных, внесенных с начала транзакции или из точки сохранения.
ROLLBACK TRANSACTION также освобождает ресурсы, удерживаемые транзакцией.
Изменения, внесенные в локальные переменные или табличные переменные, не удаляются этим оператором.
Соглашения о синтаксисе Transact-SQL
Syntax
Синтаксис ДЛЯ SQL Server, Базы данных SQL Azure, Управляемого экземпляра SQL Azure, базы данных SQL в Microsoft Fabric.
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
Синтаксис для хранилища данных Fabric, Azure Synapse Analytics и базы данных параллельного хранилища данных.
ROLLBACK { TRAN | TRANSACTION }
[ ; ]
Arguments
transaction_name
Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.
Имя, назначенное транзакции с BEGIN TRANSACTION. Аргумент transaction_name должен соответствовать правилам для идентификаторов, однако используются только первые 32 символа имени транзакции. При наличии внутренних транзакций transaction_name должно быть именем из самой внешней BEGIN TRANSACTION инструкции.
transaction_name всегда учитывает регистр, даже если экземпляр ядра СУБД не учитывает регистр.
@tran_name_variable
Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.
Имя определяемой пользователем переменной, содержащей допустимое имя транзакции. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar.
savepoint_name
savepoint_name из инструкцииSAVE TRANSACTION. Аргумент savepoint_name должен соответствовать требованиям, предъявляемым к идентификаторам. Используйте savepoint_name , если откат должен повлиять только на часть транзакции после точки сохранения.
@savepoint_variable
Имя определяемой пользователем переменной, содержащей допустимое имя точки сохранения. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar.
Обработка ошибок
Оператор ROLLBACK TRANSACTION не создает сообщения пользователю. Если предупреждения необходимы в хранимых процедурах или триггерах, используйте RAISERROR инструкции или PRINT инструкции.
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.
Замечание
Ядро СУБД не поддерживает независимо управляемые вложенные транзакции. Фиксация внутренних транзакций уменьшается @@TRANCOUNT , но не имеет других последствий. Откат внутренней транзакции всегда откатывает внешнюю транзакцию, если точка сохранения не существует и не указана в инструкции ROLLBACK .
Interoperability
В хранимых процедурах ROLLBACK TRANSACTION оператор без savepoint_name или transaction_name откатывает все инструкции в самую BEGIN TRANSACTIONвнешнюю. Инструкция ROLLBACK TRANSACTION в хранимой процедуре, которая вызывает @@TRANCOUNT другое значение при завершении процедуры, чем значение при запуске процедуры, создает информационное сообщение. Это сообщение не влияет на последующую обработку.
ROLLBACK TRANSACTION Если триггер выдан в триггере:
Все изменения данных, сделанные к настоящему времени в текущей базе данных, откатываются, включая изменения, сделанные триггером.
Триггер продолжает выполнять все оставшиеся инструкции после инструкции
ROLLBACK. Если какие-либо из этих инструкций изменяют данные, изменения не откатываются. Вложенные триггеры не выполняются при выполнении оставшихся инструкций.Инструкции в пакете после запуска триггера не выполняются.
@@TRANCOUNT увеличивается по одному при вводе триггера, даже если в режиме автозаверждения. Система обрабатывает триггер как подразумеваемую внутреннюю транзакцию.
Оператор ROLLBACK TRANSACTION в хранимой процедуре не влияет на последующие инструкции в пакете, вызываемом процедурой. Последующие инструкции в пакете выполняются.
Оператор ROLLBACK TRANSACTION в триггере завершает пакет, содержащий инструкцию, которая запустила триггер. Последующие инструкции в пакете не выполняются.
Эффект курсора ROLLBACK определяется следующими правилами:
Если
CURSOR_CLOSE_ON_COMMITзадано значениеON, закрывается,ROLLBACKно не освобождается все открытые курсоры.Если
CURSOR_CLOSE_ON_COMMITзадано значениеOFF,ROLLBACKне влияет на открытые синхронные или курсоры илиINSENSITIVEасинхронныеSTATICSTATICкурсоры, которые полностью заполнены. Открытые курсоры любого другого типа закрываются, но не освобождаются.Ошибка, которая завершает пакет и откатывает все курсоры, объявленные в пакете, содержащие инструкцию, создающую ошибку. Все курсоры освобождены независимо от их типа или параметра
CURSOR_CLOSE_ON_COMMIT. К ним относятся курсоры, объявленные в хранимых процедурах, вызванных пакетом, создающим ошибку. Курсоры, объявленные в пакете до того, как пакет создает ошибку, применяются к предыдущим двум правилам.Взаимоблокировка является примером этой ошибки. Инструкция, выданная
ROLLBACKв триггере, также приводит к этому поведению.
Поведение блокировки
Инструкция ROLLBACK TRANSACTION , указывающая savepoint_name освобождает все блокировки, приобретенные за пределами точки сохранения, за исключением эскалации и преобразованных блокировок. Эти блокировки не выпускаются, и они не преобразуются обратно в предыдущий режим блокировки.
Permissions
Необходимо членство в роли public.
Examples
В следующем примере демонстрируется эффект отката именованной транзакции: После создания таблицы следующие инструкции запускают именованную транзакцию, вставляют две строки и откатывают транзакцию с именем в переменной @TransactionName. Другой оператор вне именованной транзакции вставляет две строки. Запрос возвращает результаты предыдущих инструкций.
USE tempdb;
CREATE TABLE ValueTable
(
value INT
);
DECLARE @TransactionName AS 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