Compartilhar via


COMMIT TRANSACTION (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Warehouse do PDW (Analytics Platform System) 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));