ROLLBACK TRANSACTION (Transact-SQL)

 

Publicado: dezembro de 2016

ESTE TÓPICO APLICA-SE A:simSQL Server (a partir do 2008)simBanco de Dados SQL do AzuresimAzure SQL Data Warehouse simParallel Data Warehouse

Reverte uma transação explícita ou implícita ao começo da transação ou a um ponto de salvamento dentro da transação. Você pode usar ROLLBACK TRANSACTION para apagar todas as modificações de dados feitas desde o começo da transação ou até um ponto de salvamento. Ela também libera recursos mantidos pela transação.

Topic link icon Convenções de sintaxe Transact-SQL

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

transaction_name
É o nome atribuído à transação em BEGIN TRANSACTION. transaction_name deve obedecer às regras para identificadores, mas somente os primeiros 32 caracteres do nome da transação são usados. Ao aninhar transações, transaction_name deve ser o nome da instrução BEGIN TRANSACTION externa. transaction_name é sempre maiusculas e minúsculas, mesmo quando a instância do SQL Server não diferencia maiusculas 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 char, varchar, nchar, ou nvarchar tipo de dados.

savepoint_name
É savepoint_name de uma instrução SAVE TRANSACTION. savepoint_name deve obedecer às regras para identificadores. Use savepoint_name quando uma reversão condicional 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 deve ser declarada com um char, varchar, nchar, ou nvarchar tipo de dados.

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

ROLLBACK TRANSACTION sem um savepoint_name ou transaction_name reverte ao início da transação. Ao aninhar transações, essa mesma instrução reverte todas as transações internas para a instrução externa BEGIN TRANSACTION. Em ambos os casos, ROLLBACK TRANSACTION reduz a @@TRANCOUNT função do sistema como 0. ROLLBACK TRANSACTION savepoint_name não diminui @@TRANCOUNT.

ROLLBACK TRANSACTION não pode referenciar uma savepoint_name de transações distribuídas iniciadas tanto explicitamente com BEGIN DISTRIBUTED TRANSACTION ou escalonada a partir de uma transação local.

Uma transação não poderá ser revertida depois que uma instrução COMMIT TRANSACTION tiver sido executada, exceto quando COMMIT TRANSACTION estiver associada com uma transação aninhada que está contida dentro da transação que está sendo revertida. Nesta instância, a transação aninhada também será revertida, mesmo se você tiver emitido um COMMIT TRANSACTION para isto.

Em uma transação, são permitidos nomes de ponto de salvamento duplicados, mas uma ROLLBACK TRANSACTION que usa o nome de ponto de salvamento duplicado reverte-se somente à SAVE TRANSACTION mais recente usando aquele nome de ponto de salvamento.

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

Se uma ROLLBACK TRANSACTION for emitida em um disparador:

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

  • O disparador continua executando todas as instruções restantes depois da instrução ROLLBACK. 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.

  • Não são executadas as instruções no lote depois da instrução que ativou o disparador.

@@TRANCOUNT é incrementada em um quando entrar em um disparador, mesmo quando em modo de confirmação automática. (O sistema trata um disparador como uma transação aninhada implícita.)

Instruções ROLLBACK TRANSACTION em procedimentos armazenados não afetam instruções subsequentes no lote que chamou o procedimento; instruções subsequentes no lote são executadas. Instruções ROLLBACK TRANSACTION em disparadores finalizam o lote contendo a instrução que ativou o disparador; instruções subsequentes no lote são executadas.

O efeito de um ROLLBACK em cursores está definido por estas três regras:

  1. Com CURSOR_CLOSE_ON_COMMIT definido como ON, ROLLBACK fecha, mas desaloca todos os cursores abertos.

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

  3. 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. Cursores declarados em um lote anterior ao lote com erro estão sujeitos às regras 1 e 2. Um erro de deadlock é um exemplo desse tipo de erro. Uma instrução ROLLBACK emitida em um disparador também gera automaticamente esse tipo de erro.

Uma instrução ROLLBACK TRANSACTION que especifica um savepoint_name libera qualquer bloqueio adquirido além do ponto de salvamento, exceto escalonamentos e conversões. Esses bloqueios não são liberados e não são revertidos ao modo de bloqueio anterior.

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

O exemplo a seguir mostra o efeito da reversão de uma transação nomeada.

USE tempdb;  
GO  
CREATE TABLE ValueTable ([value] int;)  
GO  
  
DECLARE @TransactionName varchar(20) = 'Transaction1';  
  
--The following statements start a named transaction,  
--insert two rows, and then roll back  
--the transaction named in the variable @TransactionName.  
--Another statement outside of the named transaction inserts two rows.  
--The query returns the results of the previous statements.  
  
BEGIN TRAN @TransactionName  
       INSERT INTO ValueTable VALUES(1), (2);  
ROLLBACK TRAN @TransactionName;  
  
INSERT INTO ValueTable VALUES(3),(4);  
  
SELECT [value] FROM ValueTable;  
  
DROP TABLE ValueTable;  
  
--Results  
--value  
-------------  
--3  
--4  

INICIAR TRANSAÇÃO DISTRIBUÍDA (. O Transact-SQL e&41;
INICIAR TRANSAÇÃO (. O Transact-SQL e&41;
CONFIRMAR TRANSAÇÃO (. O Transact-SQL e&41;
TRABALHO de CONFIRMAÇÃO e&40; O Transact-SQL e&41;
TRABALHO de REVERSÃO e&40; O Transact-SQL e&41;
SALVAR TRANSAÇÃO (. O Transact-SQL e&41;

Contribuições da comunidade

ADICIONAR
Mostrar: