Compartilhar via


COMMIT TRANSACTION (Transact-SQL)

Marca o término de uma transação implícita ou explícita que teve êxito. Se @@TRANCOUNT for 1, COMMIT TRANSACTION transformará todas as modificações de dados executadas desde o início da transação em parte permanente do banco de dados, liberará os recursos ocupados pela transação e decrementará @@TRANCOUNT para 0. If @@TRANCOUNT for maior que 1, COMMIT TRANSACTION decrementará @@TRANCOUNT apenas de 1 e a transação continuará ativa.

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

Sintaxe

COMMIT { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ]
[ ; ]

Argumentos

  • transaction_name
    É ignorado pelo Mecanismo de banco de dados do SQL Server. transaction_name especifica um nome de transação atribuído por uma BEGIN TRANSACTION anterior. transaction_name deve estar em conformidade com as regras de identificadores, mas não pode exceder 32 caracteres. transaction_name pode ser usado como um auxílio à legibilidade, indicando aos programadores a qual BEGIN TRANSACTION aninhada a COMMIT TRANSACTION está associada.

  • @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. Se mais de 32 caracteres forem transmitidos à variável, apenas 32 caracteres serão usados; os demais serão truncados.

Comentários

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

Se a transação confirmada for uma transação distribuída de Transact-SQL, COMMIT TRANSACTION irá disparar MS DTC para usar um protocolo 2PC para confirmar todos os servidores envolvidos na transação. Se 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 2PC interno para confirmar todos os bancos de dados envolvidos na transação.

Quando usado 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 emitida mediante @@TRANCOUNT maior que 1, apenas decrementa @@TRANCOUNT de 1. Quando @@TRANCOUNT é, finalmente, decrementado para 0, a toda a transação externa é confirmada. Como transaction_name é ignorado pelo Mecanismo de Banco de Dados, emitir uma COMMIT TRANSACTION com referência ao nome de uma transação externa quando há transações internas pendentes apenas decrementa @@TRANCOUNT de 1.

Emitir uma COMMIT TRANSACTION quando @@TRANCOUNT é 0 resulta em erro; não há BEGIN TRANSACTION correspondente.

Não é possível reverter uma transação após a emissão de uma instrução COMMIT TRANSACTION, porque as modificações de dados se tornam parte permanente do banco de dados.

O Mecanismo de Banco de Dados no SQL Server 2000 e posteriores incrementa a contagem de transações em uma instrução apenas ela se encontra em 0 ao início da instrução. No SQL Server versão 7.0, a contagem de transações é sempre incrementada, independentemente da contagem de transações ao início da instrução. Isso pode fazer com que o valor retornado por @@TRANCOUNT em gatilhos seja inferior no SQL Server 2000 e posterior do que no SQL Server versão 7.0.

No SQL Server 2000 e posteriores, se uma instrução COMMIT TRANSACTION ou COMMIT WORK for executada em um gatilho e não houver uma instrução BEGIN TRANSACTION explícita ou implícita correspondente ao início do gatilho, os usuários poderão presenciar um comportamento diferente daquele no SQL Server versão 7.0. Não é recomendável colocar instruções COMMIT TRANSACTION ou COMMIT WORK em um gatilho.

Permissões

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

Exemplos

A. Confirmando uma transação

O exemplo a seguir exclui um candidato a emprego.

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

B. Confirmando uma transação aninhada

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 servem apenas de auxílio à legibilidade, para ajuda ajudar o programador a assegurar que o número adequado de confirmações esteja codificado para decrementar @@TRANCOUNT para 0 e, assim, confirmar a transação externa.

USE AdventureWorks2008R2;
GO
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;
GO
PRINT N'Transaction count after BEGIN OuterTran = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (1, 'aaa');
GO
-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;
GO
PRINT N'Transaction count after BEGIN Inner1 = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (2, 'bbb');
GO
-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;
GO
PRINT N'Transaction count after BEGIN Inner2 = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (3, 'ccc');
GO
-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;
GO
PRINT N'Transaction count after COMMIT Inner2 = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO
-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;
GO
PRINT N'Transaction count after COMMIT Inner1 = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO
-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;
GO
PRINT N'Transaction count after COMMIT OuterTran = '
    + CAST(@@TRANCOUNT AS nvarchar(10));
GO