Partilhar via


TRANSAÇÃO DE REVERSÃO (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Armazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

Esta instrução reverte uma transação explícita ou implícita para o início da transação ou para um ponto de salvamento dentro da transação. Você pode usar ROLLBACK TRANSACTION para apagar todas as modificações de dados feitas desde o início da transação ou para um ponto de salvamento. Também libera recursos detidos pela transação.

A reversão de uma transação não inclui alterações feitas em variáveis locais ou variáveis de tabela. Essas alterações não são apagadas por esta declaração.

Transact-SQL convenções de sintaxe

Syntax

Sintaxe para SQL Server, Banco de Dados SQL do Azure e Banco de Dados SQL de Malha.

ROLLBACK { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable
    | savepoint_name | @savepoint_variable ]
[ ; ]

Sintaxe do Fabric Data Warehouse, Azure Synapse Analytics e Parallel Data Warehouse Database.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

O nome atribuído à transação em BEGIN TRANSACTION. transaction_name deve estar em conformidade com as regras para identificadores, mas apenas os primeiros 32 caracteres do nome da transação são usados. Quando você aninha transações, transaction_name deve ser o nome da instrução mais BEGIN TRANSACTION externa. transaction_name diferencia maiúsculas de minúsculas, mesmo quando a instância do SQL Server não diferencia maiúsculas de minúsculas.

@tran_name_variable

O nome de uma variável definida pelo usuário que contém um nome de transação válido. A variável deve ser declarada com um tipo de dados char, varchar, nchar ou nvarchar .

savepoint_name

savepoint_name de uma SAVE TRANSACTION declaração. savepoint_name devem estar em conformidade com as regras relativas aos identificadores. Use savepoint_name quando uma reversão condicional deve afetar apenas parte da transação.

@savepoint_variable

O nome de uma variável definida pelo usuário que contém um nome de savepoint válido. A variável deve ser declarada com um tipo de dados char, varchar, nchar ou nvarchar .

Tratamento de erros

Uma ROLLBACK TRANSACTION instrução não produz mensagens para o usuário. Se forem necessários avisos em procedimentos armazenados ou gatilhos, use as RAISERROR instruções or PRINT . RAISERROR é a declaração preferida para indicar erros.

Remarks

ROLLBACK TRANSACTION sem um savepoint_name ou transaction_name reverte para o início da transação. Quando você aninha transações, essa mesma instrução reverte todas as transações internas para a instrução mais BEGIN TRANSACTION externa. Em ambos os casos, ROLLBACK TRANSACTION diminui a função do @@TRANCOUNT sistema para 0. ROLLBACK TRANSACTION <savepoint_name>não diminui.@@TRANCOUNT

ROLLBACK TRANSACTION não é possível fazer referência a um savepoint_name em transações distribuídas iniciadas explicitamente com BEGIN DISTRIBUTED TRANSACTION ou escaladas a partir de uma transação local.

Uma transação não pode ser revertida depois que uma COMMIT TRANSACTION instrução é executada, exceto quando a está associada a COMMIT TRANSACTION uma transação aninhada contida na transação que está sendo revertida. Nesse caso, a transação aninhada é revertida, mesmo que você tenha emitido um COMMIT TRANSACTION para ela.

Em uma transação, nomes de savepoint duplicados são permitidos, mas o ROLLBACK TRANSACTION uso do nome de savepoint duplicado reverte apenas para o mais recente SAVE TRANSACTION usando esse nome de savepoint.

Interoperability

Em procedimentos armazenados, ROLLBACK TRANSACTION instruções sem savepoint_name ou transaction_name reverter todas as instruções para o mais BEGIN TRANSACTIONexterno. Uma ROLLBACK TRANSACTION instrução em um procedimento armazenado que faz com @@TRANCOUNT que tenha um valor diferente quando o procedimento armazenado é concluído do que o @@TRANCOUNT valor quando o procedimento armazenado foi chamado produz uma mensagem informativa. Esta mensagem não afeta o processamento subsequente.

Se um ROLLBACK TRANSACTION for emitido em um gatilho:

  • Todas as modificações de dados feitas até esse ponto na transação atual são revertidas, incluindo as feitas pelo gatilho.

  • O gatilho continua executando todas as instruções restantes após a ROLLBACK instrução. Se qualquer uma dessas instruções modificar dados, as modificações não serão revertidas. Nenhum gatilho aninhado é acionado pela execução dessas instruções restantes.

  • As instruções no lote após a instrução que disparou o gatilho não são executadas.

@@TRANCOUNT é incrementado por um ao inserir um gatilho, mesmo quando no modo de confirmação automática. (O sistema trata um gatilho como uma transação aninhada implícita.)

ROLLBACK TRANSACTION instruções em procedimentos armazenados não afetam instruções subsequentes no lote que chamou o procedimento; instruções subsequentes no lote são executadas. ROLLBACK TRANSACTION declarações em gatilhos encerram o lote contendo a declaração que disparou o gatilho; instruções subsequentes no lote não são executadas.

O efeito de a ROLLBACK nos cursores é definido por estas três regras:

  • Com CURSOR_CLOSE_ON_COMMIT set ON, ROLLBACK fecha, mas não desaloca todos os cursores abertos.

  • Com CURSOR_CLOSE_ON_COMMIT o conjunto OFF, ROLLBACK não afeta nenhum síncrono STATICINSENSITIVE aberto, cursores ou cursores assíncronos STATIC que foram totalmente preenchidos. Os cursores abertos de qualquer outro tipo são fechados, mas não deslocalizados.

  • Um erro que encerra um lote e gera uma reversão interna deslocaliza todos os cursores que foram declarados no lote que contém a instrução de erro. Todos os cursores são desalocados independentemente do seu tipo ou da configuração de CURSOR_CLOSE_ON_COMMIT. Isso inclui cursores declarados em procedimentos armazenados chamados pelo lote de erro. Os cursores declarados em um lote antes do lote de erro estão sujeitos às duas primeiras regras. Um erro de bloqueio é um exemplo desse tipo de erro. Uma ROLLBACK instrução emitida em um gatilho também gera automaticamente esse tipo de erro.

Comportamento de bloqueio

Uma ROLLBACK TRANSACTION instrução especificando um savepoint_name libera todos os bloqueios adquiridos além do ponto de salvamento, exceto escaladas e conversões. Esses bloqueios não são liberados e não são convertidos de volta para o modo de bloqueio anterior.

Permissions

Requer adesão à função pública de .

Examples

O exemplo a seguir mostra o efeito de reverter uma transação nomeada. Depois de criar uma tabela, as instruções a seguir iniciam uma transação nomeada, inserem duas linhas e revertem a transação nomeada na variável @TransactionName. Outra instrução fora da transação nomeada insere duas linhas. A consulta retorna os resultados das instruções anteriores.

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;

Aqui está o conjunto de resultados.

value
-----
3
4