Condividi tramite


COMMIT TRANSACTION (Transact-SQL)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Analytics Platform System (PDW) Warehouse in Microsoft Fabric

Contrassegna la fine di una transazione esplicita o implicita completata correttamente. Se @@TRANCOUNT è 1, COMMIT TRANSACTION apporta tutte le modifiche ai dati dall'inizio della transazione una parte permanente del database, libera le risorse della transazione e decrementa @@TRANCOUNT su 0. Quando @@TRANCOUNT è maggiore di 1, COMMIT TRANSACTION decrementa @@TRANCOUNT solo di 1 e la transazione rimane attiva.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

Sintassi per SQL Server e database SQL di Azure.

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

Sintassi per Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics e Parallel Data Warehouse Database.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

Argomenti

transaction_name

Si applica a: SQL Server e database SQL di Azure

Ignorato dal motore di database di SQL Server. transaction_name specifica un nome di transazione assegnato da un oggetto precedenteBEGIN TRANSACTION. transaction_name deve essere conforme alle regole relative agli identificatori, ma non può superare i 32 caratteri. transaction_name indica ai programmatori a cui è annidato BEGIN TRANSACTION l'oggetto COMMIT TRANSACTION è associato.

@tran_name_variable

Si applica a: SQL Server e database SQL di Azure

Nome di una variabile definita dall'utente contenente un nome di transazione valido. La variabile deve essere dichiarata con un tipo di dati char, varchar, nchar o nvarchar. Se alla variabile vengono passati più di 32 caratteri, vengono usati solo 32 caratteri. I caratteri rimanenti vengono troncati.

WITH DELAYED_DURABILITY = { OFF | ON }

Si applica a: SQL Server e database SQL di Azure

Opzione che richiede il commit della transazione con durabilità ritardata. La richiesta viene ignorata se il database è stato modificato con DELAYED_DURABILITY = DISABLED o DELAYED_DURABILITY = FORCED. Per altre informazioni, vedere Controllo della durabilità delle transazioni.

Osservazioni:

È responsabilità del programmatore Transact-SQL eseguire il problema COMMIT TRANSACTION solo in un punto in cui tutti i dati a cui fa riferimento la transazione sono logicamente corretti.

Se la transazione sottoposta a commit è una transazione distribuita Transact-SQL, COMMIT TRANSACTION attiva MS DTC per usare un protocollo di commit in due fasi per eseguire il commit di tutti i server coinvolti nella transazione. Quando una transazione locale include due o più database nella stessa istanza del motore di database, l'istanza esegue il commit di tutti i database coinvolti nella transazione usando il protocollo 2PC interno.

Se usati in transazioni annidate, i commit delle transazioni interne non liberano le risorse o non rendono permanenti le modifiche. Queste operazioni vengono eseguite solo durante il commit delle transazioni esterne. Ogni COMMIT TRANSACTION emesso quando @@TRANCOUNT è maggiore di uno semplicemente decrementa @@TRANCOUNT di 1. Quando @@TRANCOUNT viene infine decrementato su 0, viene eseguito il commit dell'intera transazione esterna. Poiché transaction_name viene ignorato dal motore di database, eseguendo un COMMIT TRANSACTION riferimento al nome di una transazione esterna quando sono presenti transazioni interne in sospeso solo di @@TRANCOUNT 1.

L'emissione di un oggetto COMMIT TRANSACTION quando @@TRANCOUNT è zero genera un errore; non esiste alcun oggetto corrispondente BEGIN TRANSACTION.

Non è possibile eseguire il rollback di una transazione dopo l'emissione di un'istruzione COMMIT TRANSACTION , perché le modifiche ai dati sono state apportate come parte permanente del database.

Il motore di database incrementa il conteggio delle transazioni all'interno di un'istruzione solo quando il numero di transazioni all'inizio dell'istruzione è uguale a 0.

Autorizzazioni

È richiesta l'appartenenza al ruolo public .

Esempi

Gli esempi di codice Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022 o AdventureWorksDW2022, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.

R. Eseguire il commit di una transazione

Si applica a: SQL Server, database SQL di Azure, Azure Synapse Analytics e piattaforma di analisi (PDW)

Nell'esempio seguente viene eliminato un candidato di processo.

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

B. Eseguire il commit di una transazione nidificata

Si applica a: SQL Server e database SQL di Azure

Nell'esempio seguente viene creata una tabella, viene generata una transazione nidificata su tre livelli e viene quindi eseguito il commit della transazione nidificata. Nonostante ogni istruzione COMMIT TRANSACTION includa un parametro transaction_name, non esiste alcuna relazione tra le istruzioni COMMIT TRANSACTION e BEGIN TRANSACTION. I parametri transaction_name consentono al programmatore di verificare che venga codificato il numero corretto di commit per il decremento di @@TRANCOUNT a 0 e il conseguenze commit della transazione esterna.

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));