TRANSAÇÃO DE REVERSÃO (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

Esta 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. Usa ROLLBACK TRANSACTION para apagar todas as modificações de dados feitas desde o início da transação ou de um ponto de gravação. ROLLBACK TRANSACTION também liberta os recursos detidos pela transação.

As alterações feitas a variáveis locais ou de tabela não são apagadas por esta afirmação.

Transact-SQL convenções de sintaxe

Syntax

Syntax for SQL Server, Base de Dados SQL do Azure, Azure SQL Managed Instance, SQL database no Microsoft Fabric.

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

Sintaxe para Fabric Data Warehouse e Azure Synapse Analytics.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Base de Dados SQL do Azure, Azure SQL Managed Instance, base de dados SQL no Microsoft Fabric.

O nome atribuído à transação com BEGIN TRANSACTION. transaction_name deve estar em conformidade com as regras para identificadores, mas apenas os primeiros 32 caracteres do nome da transação são usados. Quando há transações internas, transaction_name deve ser o nome da instrução mais BEGIN TRANSACTION externa. transaction_name é sempre sensível a maiúsculas e minúsculas, mesmo quando a instância do Motor de Base de Dados não é sensível a maiúsculas e minúsculas.

@tran_name_variable

Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores, Base de Dados SQL do Azure, Azure SQL Managed Instance, base de dados SQL no Microsoft Fabric.

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 SAVE TRANSACTION declaração. savepoint_name devem estar em conformidade com as regras relativas aos identificadores. Use savepoint_name quando um rollback deve afetar apenas a parte da transação após o ponto de gravação.

@savepoint_variable

O nome de uma variável definida pelo usuário que contém um nome de savepoint válido. A variável deve ser declarada com um tipo de dados char, varchar, nchar ou nvarchar .

Tratamento de erros

Uma ROLLBACK TRANSACTION instrução não produz mensagens para o usuário. Se forem necessários avisos em procedimentos armazenados ou gatilhos, use as RAISERROR instruções or PRINT .

Remarks

ROLLBACK TRANSACTION sem um savepoint_name ou transaction_name reverte para o início da transação. Quando há transações internas, esta 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_namenão diminui.@@TRANCOUNT

ROLLBACK TRANSACTION Não se pode referenciar uma savepoint_name em transações distribuídas iniciadas explicitamente ou BEGIN DISTRIBUTED TRANSACTION promovidas a partir de uma transação local.

Uma transação não pode ser revertida após a execução de uma COMMIT TRANSACTION instrução, exceto quando está associada COMMIT TRANSACTION a uma transação interna contida na transação que está a ser revertida. Neste caso, a transação interna é revertida, mesmo que tenha emitido um COMMIT TRANSACTION pedido para ela.

Em uma transação, nomes de savepoint duplicados são permitidos, mas o ROLLBACK TRANSACTION uso do nome de savepoint duplicado reverte apenas para o mais recente SAVE TRANSACTION usando esse nome de savepoint.

Observação

O Motor de Base de Dados não suporta transações aninhadas geríveis de forma independente. Um commit de uma transação interna diminui @@TRANCOUNT mas não tem outros efeitos. Um rollback de uma transação interna reverte sempre a transação externa, a menos que exista um ponto de gravação especificado na ROLLBACK instrução.

Interoperability

Em procedimentos armazenados, uma ROLLBACK TRANSACTION instrução sem savepoint_name ou transaction_name reverte todas as instruções para o mais BEGIN TRANSACTIONexterno . Uma ROLLBACK TRANSACTION instrução num procedimento armazenado que faz @@TRANCOUNT com que tenha um valor diferente na conclusão do procedimento do que o valor no início do procedimento produz uma mensagem informativa. Esta mensagem não afeta o processamento subsequente.

Se um ROLLBACK TRANSACTION for emitido em um gatilho:

  • Todas as modificações de dados feitas até esse ponto na transação atual são revertidas, incluindo as feitas pelo gatilho.

  • O gatilho continua executando todas as instruções restantes após a ROLLBACK instrução. Se qualquer uma dessas instruções modificar dados, as modificações não serão revertidas. Nenhum gatilho aninhado é acionado 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 por um ao inserir um gatilho, mesmo quando no modo de confirmação automática. O sistema trata um gatilho como uma transação interna implícita.

Uma instrução num procedimento armazenado não afeta as instruções subsequentes no lote que chamou ROLLBACK TRANSACTION o procedimento. As instruções subsequentes do lote são executadas.

Uma ROLLBACK TRANSACTION instrução num trigger termina o lote que contém a instrução que disparou o trigger. As declarações subsequentes no lote não são executadas.

O efeito de a ROLLBACK nos cursores é definido pelas seguintes regras:

  • Com CURSOR_CLOSE_ON_COMMIT definido para ON, ROLLBACK fecha mas não desloca todos os cursores abertos.

  • Com definido CURSOR_CLOSE_ON_COMMIT para OFF, ROLLBACK não afeta nenhum aberto síncrono STATIC , INSENSITIVE nem cursores, nem cursores assíncronos STATIC que estejam totalmente preenchidos. Os cursores abertos de qualquer outro tipo são fechados, mas não deslocalizados.

  • Um erro que termina um lote e reverte a transação desaloca todos os cursores que foram declarados no lote que contém a instrução que gera o erro. Todos os cursores são desalocados independentemente do seu tipo ou da configuração de CURSOR_CLOSE_ON_COMMIT. Isto inclui cursores declarados em procedimentos armazenados chamados pelo lote que produz o erro. Os cursores declarados num lote antes do lote que produz o erro estão sujeitos às duas regras anteriores.

    Um impasse é um exemplo deste tipo de erro. Uma declaração emitida ROLLBACK num gatilho também resulta neste comportamento.

Comportamento de bloqueio

Uma ROLLBACK TRANSACTION declaração que especifica um savepoint_name liberta quaisquer bloqueios adquiridos para além do ponto de gravação, exceto os bloqueios escalados e convertidos. Esses bloqueios não são liberados e não são convertidos de volta para o modo de bloqueio anterior.

Permissions

Requer associação à public função.

Examples

O exemplo a seguir mostra o efeito de reverter 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;
CREATE TABLE ValueTable
(
    value INT
);

DECLARE @TransactionName AS 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;

Aqui está o conjunto de resultados.

value
-----
3
4