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 }
[ ; ]
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
setON
,ROLLBACK
fecha, mas não desaloca todos os cursores abertos.Com
CURSOR_CLOSE_ON_COMMIT
setOFF
,ROLLBACK
não afeta nenhum cursor ou cursor síncronoSTATIC
INSENSITIVE
aberto ou cursor assíncronoSTATIC
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. UmaROLLBACK
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;
Veja a seguir o conjunto de resultados.
value
-----
3
4