Compartilhar via


COMMIT TRANSACTION (Transact-SQL)

Marca o término de uma transação implícita ou explícita bem-sucedida. 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. Se @@TRANCOUNT for maior que 1, COMMIT TRANSACTION decrementará @@TRANCOUNT apenas em 1 e a transação continuará ativa.

Aplica-se a: SQL Server (do SQL Server 2008 à versão atual), Banco de dados SQL do Azure (da versão inicial até a versão atual).

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

Sintaxe

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

Argumentos

  • transaction_name
    É ignorado pelo Mecanismo de Banco de Dados do SQL Server. transaction_name especifica um nome de transação atribuído por um BEGIN TRANSACTION anterior. transaction_name* *deve seguir as regras de identificadores, mas não pode exceder 32 caracteres. transaction_name pode ser usado como um auxílio de capacidade de leitura por meio da indicação aos programadores de a qual BEGIN TRANSACTION aninhado o COMMIT TRANSACTION está associado.

  • @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.

  • DELAYED_DURABILITY
    Opção que solicita que esta transação seja confirmada com durabilidade atrasada. A solicitação será ignorada se o banco de dados for alterado com DELAYED_DURABILITY = DISABLED ou DELAYED_DURABILITY = FORCED. Consulte o tópico Controlar a durabilidade da transação para obter mais informações.

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 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 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 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 public.

Exemplos

A.Confirmando uma transação

O exemplo a seguir exclui um candidato a emprego.

USE AdventureWorks2012;
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 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 AdventureWorks2012;
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

Consulte também

Referência

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

BEGIN TRANSACTION (Transact-SQL)

COMMIT WORK (Transact-SQL)

ROLLBACK TRANSACTION (Transact-SQL)

ROLLBACK WORK (Transact-SQL)

SAVE TRANSACTION (Transact-SQL)

@@TRANCOUNT (Transact-SQL)