Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к: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