COMMIT TRANSACTION (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Warehouse in Microsoft Fabric

Marca o término de uma transação implícita ou explícita bem-sucedida. Se @@TRANCOUNT for 1, COMMIT TRANSACTION torna todas as modificações de dados desde o início da transação uma parte permanente do banco de dados, libera os recursos da transação e diminui @@TRANCOUNT para 0. Quando @@TRANCOUNT for maior que 1, COMMIT TRANSACTION decrementos @@TRANCOUNT apenas por 1 e a transação permanece ativa.

Convenções de sintaxe de Transact-SQL

Sintaxe

Sintaxe para SQL Server e Banco de Dados SQL do Azure.

COMMIT [ { TRAN | TRANSACTION }
    [ transaction_name | @tran_name_variable ] ]
    [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]

Sintaxe do Synapse Data Warehouse no Microsoft Fabric, no Azure Synapse Analytics e no Banco de Dados Parallel Data Warehouse.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

transaction_name

Aplica-se a: SQL Server e Banco de Dados SQL do Azure

Ignorado pelo Mecanismo de Banco de Dados do SQL Server. transaction_name especifica um nome de transação atribuído por um BEGIN TRANSACTIONarquivo . transaction_name precisa estar em conformidade com as regras para identificadores, mas não pode exceder 32 caracteres. transaction_name indica aos programadores a qual aninhado BEGIN TRANSACTION o COMMIT TRANSACTION está associado.

@tran_name_variable

Aplica-se a: SQL Server e Banco de Dados SQL do Azure

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. Se mais de 32 caracteres forem passados para a variável, apenas 32 caracteres serão usados. Os caracteres restantes são truncados.

COM DELAYED_DURABILITY = { OFF | ON }

Aplica-se a: SQL Server e Banco de Dados SQL do Azure

Opção que solicita que esta transação seja confirmada com durabilidade atrasada. A solicitação será ignorada se o banco de dados tiver sido alterado com DELAYED_DURABILITY = DISABLED ou DELAYED_DURABILITY = FORCED. Para obter mais informações, veja Controlar a durabilidade da transação.

Comentários

É responsabilidade do programador Transact-SQL emitir COMMIT TRANSACTION apenas em um ponto em que todos os dados referenciados pela transação estejam logicamente corretos.

Se a transação confirmada foi uma transação distribuída Transact-SQL, COMMIT TRANSACTION acionará o MS DTC para usar um protocolo de confirmação de duas fases para confirmar todos os servidores envolvidos na transação. Quando uma transação local atingir dois ou mais bancos de dados na mesma instância do Mecanismo de Banco de Dados, essa instância usará um protocolo 2PC interno para confirmar todos os bancos de dados envolvidos na transação.

Quando usadas em transações aninhadas, as confirmações das transações internas não liberam recursos, nem lhes fazem modificações permanentes. As modificações de dados se tornam permanentes, com liberação dos recursos, apenas quando a transação externa é confirmada. Cada COMMIT TRANSACTION emitido quando @@TRANCOUNT é maior do que um simplesmente diminui @@TRANCOUNT por 1. Quando @@TRANCOUNT é finalmente diminuído para 0, toda a transação externa é confirmada. Como transaction_name é ignorado pelo Mecanismo de Banco de Dados, emitir uma COMMIT TRANSACTION referência ao nome de uma transação externa quando há transações internas pendentes @@TRANCOUNT só diminui em 1.

Emitir um COMMIT TRANSACTION quando @@TRANCOUNT é zero resulta em um erro, não há correspondente BEGIN TRANSACTION.

Não é possível reverter uma transação depois que uma COMMIT TRANSACTION instrução é emitida, porque as modificações de dados foram feitas uma parte permanente do banco de dados.

O Mecanismo de Banco de Dados incrementa a contagem de transações em uma instrução apenas quando essa contagem é 0 no início da instrução.

Permissões

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

Exemplos

Este artigo requer o banco de dados de exemplo AdventureWorks2022, que pode ser baixado na home page Microsoft SQL Server Samples and Community Projects.

R. Confirmar uma transação

Aplica-se a: SQL Server, Banco de Dados SQL do Azure, Azure Synapse Analytics e PDW (Analytics Platform System)

O exemplo a seguir exclui um candidato a emprego.

BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
COMMIT TRANSACTION;

B. Confirmar uma transação aninhada

Aplica-se a: SQL Server e Banco de Dados SQL do Azure

O exemplo a seguir cria uma tabela, gera três níveis de transações aninhadas e, em seguida, confirma a transação aninhada. Embora cada instrução COMMIT TRANSACTION tenha um parâmetro transaction_name, não há nenhuma relação entre as instruções COMMIT TRANSACTION e BEGIN TRANSACTION. Os parâmetros transaction_name ajudam o programador a assegurar que o número correto de confirmações seja codificado para decrementar @@TRANCOUNT para 0 e, assim, confirmar a transação externa.

IF OBJECT_ID(N'TestTran', N'U') IS NOT NULL
    DROP TABLE TestTran;
GO

CREATE TABLE TestTran (
    Cola INT PRIMARY KEY,
    Colb CHAR(3)
);
GO

-- This statement sets @@TRANCOUNT to 1.
BEGIN TRANSACTION OuterTran;

PRINT N'Transaction count after BEGIN OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (1, 'aaa');

-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;

PRINT N'Transaction count after BEGIN Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (2, 'bbb');

-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;

PRINT N'Transaction count after BEGIN Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

INSERT INTO TestTran
VALUES (3, 'ccc');

-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;

PRINT N'Transaction count after COMMIT Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;

PRINT N'Transaction count after COMMIT Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));

-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;

PRINT N'Transaction count after COMMIT OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));