Compartilhar via


ROLLBACK TRANSACTION (Transact-SQL)

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.

Ícone de vínculo de tópico Convenções de sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • transaction_name
    É o nome atribuído à transação em BEGIN TRANSACTION. transaction_name deve estar de acordo com as regras de identificadores, mas somente os primeiros 32 caracteres do nome da transação serão usados. Ao aninhar transações, transaction_name deve ser o nome da instrução externa BEGIN TRANSACTION.

  • @ 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 tipo de dados char, varchar, nchar ou nvarchar.

  • savepoint_name
    É savepoint_name de uma transação SAVE TRANSACTION. savepoint_name deve obedecer às regras de 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 tipo de dados char, varchar, nchar ou nvarchar.

Tratamento de erros

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.

Comentários gerais

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 função de sistema @@TRANCOUNT para 0. ROLLBACK TRANSACTION savepoint_name não diminui @@TRANCOUNT.

ROLLBACK TRANSACTION não pode referenciar um savepoint_name em transações distribuídas ou iniciadas 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.

Interoperabilidade

Em procedimentos armazenados, instruções ROLLBACK TRANSACTION sem um savepoint_name ou transaction_name revertem todas as instruções à BEGIN TRANSACTION externa. Uma instrução ROLLBACK TRANSACTION em um procedimento armazenado que faz com que @@TRANCOUNT tenha um valor diferente, quando o procedimento armazenado é concluído, do que o valor @@TRANCOUNT, quando o procedimento armazenado 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 é incrementado em um ao entrar em um disparador, mesmo no 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.

Comportamento de bloqueio

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

Permissões

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

Exemplos

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

Consulte também

Referência

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

BEGIN TRANSACTION (Transact-SQL)

COMMIT TRANSACTION (Transact-SQL)

COMMIT WORK (Transact-SQL)

ROLLBACK WORK (Transact-SQL)

SAVE TRANSACTION (Transact-SQL)