Compartilhar via


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

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Warehouse no Microsoft FabricBanco de dados SQL no Microsoft Fabric

Essa 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ê usa ROLLBACK TRANSACTION para apagar todas as modificações de dados feitas desde o início da transação ou de um ponto de salvamento. ROLLBACK TRANSACTION também libera os recursos mantidos pela transação.

As alterações feitas em variáveis locais ou variáveis de tabela não são apagadas por essa instrução.

Convenções de sintaxe de Transact-SQL

Syntax

Sintaxe para SQL Server, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, Banco de Dados SQL no Microsoft Fabric.

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

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

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, Banco de Dados SQL no Microsoft Fabric.

O nome atribuído à transação com BEGIN TRANSACTION. transaction_name precisa estar em conformidade com as regras para identificadores, mas somente os primeiros 32 caracteres do nome da transação são usados. Quando há transações internas, transaction_name deve ser o nome da instrução mais BEGIN TRANSACTION externa. transaction_name sempre diferencia maiúsculas de minúsculas, mesmo quando a instância do Mecanismo de Banco de Dados não diferencia maiúsculas de minúsculas.

@tran_name_variable

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, Banco de Dados SQL no Microsoft Fabric.

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

savepoint_name

savepoint_name de uma SAVE TRANSACTION declaração. savepoint_name precisa estar em conformidade com as regras para identificadores. Use savepoint_name quando uma reversão deve afetar apenas a parte da transação após o ponto de salvamento.

@savepoint_variable

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

Tratamento de erros

Uma ROLLBACK TRANSACTION instrução não produz nenhuma mensagem para o usuário. Se forem necessários avisos em procedimentos armazenados ou gatilhos, use as RAISERROR instruções or PRINT .

Remarks

ROLLBACK TRANSACTION sem um savepoint_name ou transaction_name reverte para o início da transação. Quando há transações internas, 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_namenão diminui.@@TRANCOUNT

ROLLBACK TRANSACTION não pode referenciar um savepoint_name em transações distribuídas iniciadas explicitamente com BEGIN DISTRIBUTED TRANSACTION ou promovidas de uma transação local.

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

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

Observação

O Mecanismo de Banco de Dados não dá suporte a transações aninhadas gerenciáveis de forma independente. Uma confirmação de uma transação interna diminui @@TRANCOUNT , mas não tem outros efeitos. Uma reversão de uma transação interna sempre reverte a transação externa, a menos que um ponto de salvamento exista e seja especificado na instrução ROLLBACK .

Interoperability

Em procedimentos armazenados, uma ROLLBACK TRANSACTION instrução sem um savepoint_name ou transaction_name reverte todas as instruções para a parte externa BEGIN TRANSACTION. Uma ROLLBACK TRANSACTION instrução em um procedimento armazenado que faz @@TRANCOUNT com que um valor diferente na conclusão do procedimento do que o valor no início do procedimento produza uma mensagem informativa. Essa mensagem não afeta o processamento subsequente.

Se a ROLLBACK TRANSACTION for emitido em um gatilho:

  • Todas as modificações de dados feitas até aquele ponto na transação atual serão revertidas, incluindo qualquer uma feita pelo disparador.

  • O gatilho continua executando todas as instruções restantes após a ROLLBACK instrução. Se alguma dessas instruções modificar dados, as modificações não serão revertidas. Nenhum disparador aninhado é ativado 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 em um ao inserir um gatilho, mesmo quando no modo de confirmação automática. O sistema trata um gatilho como uma transação interna implícita.

Uma ROLLBACK TRANSACTION instrução em um procedimento armazenado não afeta as instruções subsequentes no lote que chamou o procedimento. Instruções subsequentes no lote são executadas.

Uma ROLLBACK TRANSACTION instrução em um gatilho encerra o lote que contém a instrução que disparou o gatilho. As instruções subsequentes no lote não são executadas.

O efeito de um ROLLBACK cursor é definido pelas seguintes regras:

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

  • Com CURSOR_CLOSE_ON_COMMIT definido como OFF, ROLLBACK não afeta nenhum cursor síncrono STATIC aberto ou INSENSITIVE cursors ou cursores assíncronos STATIC que são totalmente preenchidos. Cursores abertos de qualquer outro tipo são fechados, mas não desalocados.

  • Um erro que encerra um lote e reverte a transação desaloca todos os cursores que foram declarados no lote que contém a instrução que produz o erro. Todos os cursores são desalocados, independentemente do tipo ou da configuração de CURSOR_CLOSE_ON_COMMIT. Isso inclui cursores declarados em procedimentos armazenados chamados pelo lote que produz o erro. Os cursores declarados em um lote antes do lote produzir o erro estão sujeitos às duas regras anteriores.

    Um deadlock é um exemplo desse tipo de erro. Uma ROLLBACK instrução emitida em um gatilho também resulta nesse comportamento.

Comportamento de bloqueio

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

Permissions

Exige a associação à função public.

Examples

O exemplo a seguir mostra o efeito da reversão de 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;
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;

Veja a seguir o conjunto de resultados.

value
-----
3
4