ROLLBACK TRANSACTION (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Warehouse in 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ê 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. Ela também libera recursos mantidos 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.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

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

Sintaxe do Synapse Data Warehouse no Microsoft Fabric, no Azure Synapse Analytics e no Banco de Dados Parallel Data Warehouse.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

transaction_name

O nome atribuído à transação em 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 você aninha transações, 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 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 precisa ser declarada com o tipo de dados char, varchar, nchar ou nvarchar.

savepoint_name

savepoint_name de um SAVE TRANSACTION comunicado. savepoint_name precisa estar em conformidade com as regras para identificadores. Use savepoint_name quando uma reversão condicional precisar afetar somente parte da transação.

@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 ou PRINT . RAISERROR é a instrução preferida para indicar erros.

Comentários

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 decremento @@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 COMMIT TRANSACTION está associada a uma transação aninhada que está contida na transação que está sendo revertida. Nesse caso, a transação aninhada é revertida, mesmo se você emitiu um COMMIT TRANSACTION para ela.

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

Interoperabilidade

Em procedimentos armazenados, ROLLBACK TRANSACTION instruções sem um 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. Essa mensagem não afeta o processamento subsequente.

Se um 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 por um ao entrar em um gatilho, mesmo quando no modo de confirmação automática. (O sistema trata um disparador 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 instruções em gatilhos encerram o lote que contém a instruçã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 set OFF, ROLLBACK não afeta nenhum síncrono STATIC aberto ou INSENSITIVE cursores ou cursores assíncronos STATIC que foram totalmente preenchidos. Cursores abertos de qualquer outro tipo são fechados, mas não desalocados.

  • Um erro que termina um lote e gera uma reversão interna desaloca todos os cursores que foram declarados no lote que contém a instrução de erro. Todos os cursores são desalocados, independentemente de seu tipo ou da configuração de CURSOR_CLOSE_ON_COMMIT. Isso inclui cursores declarados em procedimentos armazenados chamados pelo lote com erro. Os cursores declarados em um lote antes do lote de erro estão sujeitos às duas primeiras regras. Um erro de deadlock é um exemplo desse tipo de erro. Uma ROLLBACK declaraçã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 para escalonamentos e conversões. Esses bloqueios não são liberados e não são convertidos de volta para o modo de bloqueio anterior.

Permissões

Requer associação à função pública .

Exemplos

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;
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;

Este é o conjunto de resultados.

value
-----
3
4