COMMIT TRANSACTION (Transact-SQL)
Aplica-se a: Banco de Dados SQL do SQL do SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Warehouse do PDW (Analytics Platform System) no Microsoft Fabric Banco de dados SQL no 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
diminuirá @@TRANCOUNT
apenas em 1 e a transação permanecerá 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 para o data warehouse do Synapse no Microsoft Fabric, no Azure Synapse Analytics e no banco de dados do data warehouse paralelo.
COMMIT [ TRAN | TRANSACTION ]
[ ; ]
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 TRANSACTION
. transaction_name precisa estar em conformidade com as regras para identificadores, mas não pode exceder 32 caracteres. transaction_name indica aos programadores com 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 | LIGADO }
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
somente em um ponto em que todos os dados referenciados pela transação estejam logicamente corretos.
Se a transação confirmada for uma transação distribuída Transact-SQL, COMMIT TRANSACTION
o MS DTC 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 que um simplesmente diminui @@TRANCOUNT
em 1. Quando @@TRANCOUNT
é finalmente decrementado 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
diminui apenas em 1.
Emitir um COMMIT TRANSACTION
quando @@TRANCOUNT
é zero resulta em um erro; não há nenhum BEGIN TRANSACTION
.
Você não pode reverter uma transação depois que um COMMIT TRANSACTION
demonstrativo é emitido, porque as modificações de dados se tornaram 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
Os exemplos de código do Transact-SQL deste artigo usa o banco de dados de exemplo AdventureWorks2022
ou AdventureWorksDW2022
, que pode ser baixado da 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));