Поделиться через


ТРАНЗАКЦИЯ ОТКАТА (Transact-SQL)

Применимо к: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