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.

Ícone de vínculo de tópicoConvençõ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 para identificadores, mas só os primeiros 32 caracteres do nome de transação sã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
    É o savepoint_name de uma instrução SAVE TRANSACTION. savepoint_name deve estar de acordo com as 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 tipo de dados char, varchar, nchar ou nvarchar.

Comentários

ROLLBACK TRANSACTION apaga 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.

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.

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.

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 pode revertida depois que uma instrução COMMIT TRANSACTION é executada.

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 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 subseqüente.

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 subseqüentes no lote que chamou o procedimento; instruções subseqüentes no lote são executadas. Instruções ROLLBACK TRANSACTION em disparadores finalizam o lote contendo a instrução que ativou o disparador; instruções subseqüentes no lote são executadas.

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.

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.

Para obter um exemplo de código demonstrando ROLLBACK TRANSACTION, consulte Aninhando transações.

Permissões

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

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

--These statements start a named transaction,
--insert a two records, and then roll back
--the transaction named in the variable 
--@TransactionName.
BEGIN TRAN @TransactionName
       INSERT INTO ValueTable VALUES(1)
       INSERT INTO ValueTable VALUES(2)
ROLLBACK TRAN @TransactionName

INSERT INTO ValueTable VALUES(3)
INSERT INTO ValueTable VALUES(4)

SELECT * FROM ValueTable

DROP TABLE ValueTable

--Results
--value
-------------
--3
--4