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.
Convenções da 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 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.
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 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 na função pública.
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 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 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)
ROLLBACK TRANSACTION (Transact-SQL)