Compartilhar via


ROLLBACK TRANSACTION (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Warehouse do PDW (Analytics Platform System) 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ê 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 para o data warehouse do Synapse no Microsoft Fabric, no Azure Synapse Analytics e no banco de dados do data warehouse paralelo.

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 uma SAVE TRANSACTION declaração. 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 or PRINT . RAISERROR é a declaraçã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 diminui.@@TRANCOUNT

ROLLBACK TRANSACTION não pode fazer referência a um savepoint_name em transações distribuídas iniciadas explicitamente ou BEGIN DISTRIBUTED TRANSACTION escalonadas 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 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 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.

Interoperabilidade

Em procedimentos armazenados, ROLLBACK TRANSACTION instruções sem um savepoint_name ou transaction_name reverter todas as instruções para o .BEGIN TRANSACTION 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 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 disparador como uma transação aninhada implícita.)

ROLLBACK TRANSACTION As instruções em procedimentos armazenados não afetam as 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; as 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 set OFF, ROLLBACK não afeta nenhum cursor ou cursor síncrono STATIC INSENSITIVE aberto ou cursor assíncrono STATIC que foi totalmente preenchido. 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 do 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 erros estão sujeitos às duas primeiras regras. Um erro de deadlock é 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 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