COMMIT TRANSACTION (Transact-SQL)

Contrassegna il termine di una transazione esplicita o implicita completata correttamente. Se il valore di @@TRANCOUNT è 1, COMMIT TRANSACTION rende permanenti nel database tutte le modifiche dei dati apportate dall'inizio della transazione, libera le risorse mantenute attive dalla transazione e decrementa il valore di @@TRANCOUNT a 0. Se il valore di @@TRANCOUNT è maggiore di 1, COMMIT TRANSACTION decrementa il valore di @@TRANCOUNT di una sola unità e la transazione rimane attiva.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

COMMIT { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ]
[ ; ]

Argomenti

  • transaction_name
    Viene ignorato in Motore di database di SQL Server. transaction_name specifica il nome di una transazione assegnato da un'istruzione BEGIN TRANSACTION precedente. transaction_namedeve essere conforme alle regole relative agli identificatori ma non può superare i 32 caratteri. transaction_name può essere utilizzato per facilitare la lettura del codice da parte dei programmatori, indicando quale istruzione BEGIN TRANSACTION nidificata è associata a COMMIT TRANSACTION.

  • @tran\_name\_variable
    Nome di una variabile definita dall'utente contenente un nome di transazione valido. La variabile deve essere dichiarata con il tipo di dati char, varchar, nchar o nvarchar. Se vengono passati più di 32 caratteri alla variabile vengono utilizzati solo i primi 32 caratteri. Quelli rimanenti vengono troncati.

Osservazioni

È compito del programmatore di Transact-SQL eseguire l'istruzione COMMIT TRANSACTION solo quando tutti i dati a cui la transazione fa riferimento sono logicamente corretti.

Se la transazione di cui è stato eseguito il commit è una transazione distribuita di Transact-SQL, l'istruzione COMMIT TRANSACTION attiva l'utilizzo di un protocollo di commit in due fasi in MS DTC per il commit di tutti i server coinvolti nella transazione. Se una transazione locale si estende su due o più database nella stessa istanza di Motore di database, per eseguire il commit di tutti i database coinvolti nella transazione viene utilizzato un commit a due fasi interno.

Quando viene eseguito in transazioni nidificate, il commit delle transazioni interne non libera risorse o non rende permanenti le modifiche. Queste operazioni vengono eseguite solo durante il commit delle transazioni esterne. Ogni COMMIT TRANSACTION eseguita quando il valore di @@TRANCOUNT è maggiore di 1 decrementa il valore di @@TRANCOUNT di una unità. Quando il valore di @@TRANCOUNT risulta uguale a 0, viene eseguito il commit dell'intera transazione esterna. Poiché in Motore di databasetransaction_name viene ignorato, l'esecuzione di COMMIT TRANSACTION con riferimento al nome di una transazione esterna quando esistono transazioni interne in attesa comporta la riduzione del valore di @@TRANCOUNT di una unità.

L'esecuzione di COMMIT TRANSACTION quando @@TRANCOUNT è uguale a 0 genera un errore. Non esiste infatti alcuna istruzione BEGIN TRANSACTION corrispondente.

Non è possibile eseguire il rollback di una transazione dopo l'esecuzione di un'istruzione COMMIT TRANSACTION. Le modifiche dei dati del database sono diventate permanenti.

Motore di database in SQL Server 2000 e versioni successive incrementa il conteggio delle transazioni all'interno di un'istruzione solo quando il numero di transazioni all'inizio dell'istruzione è uguale a 0. In SQL Server versione 7.0 il conteggio delle transazioni viene sempre incrementato, indipendentemente dal numero di transazioni all'inizio dell'istruzione. Il valore restituito da @@TRANCOUNT nei trigger può pertanto essere inferiore in SQL Server 2000 e versioni successive rispetto al valore restituito in SQL Server versione 7.0.

In SQL Server 2000 e versioni successive, se un'istruzione COMMIT TRANSACTION o COMMIT WORK viene eseguita in un trigger e all'inizio di quest'ultimo non è presente un'istruzione BEGIN TRANSACTION implicita o esplicita corrispondente, il funzionamento potrebbe essere diverso rispetto a SQL Server versione 7.0. Non è consigliabile inserire un'istruzione COMMIT TRANSACTION o COMMIT WORK all'interno di un trigger.

Autorizzazioni

È richiesta l'appartenenza al ruolo public.

Esempi

A. Per eseguire il commit di una transazione.

In questo esempio viene eliminato il candidato di un processo.

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

B. Per eseguire il commit di una transazione nidificata.

In questo esempio viene creata una tabella, viene generata una transazione nidificata su tre livelli e viene quindi eseguito il commit della transazione nidificata. Sebbene ogni istruzione COMMIT TRANSACTION includa un parametro transaction_name, non esiste una relazione tra le istruzioni COMMIT TRANSACTION e BEGIN TRANSACTION. I parametri transaction_name migliorano semplicemente il grado di leggibilità del codice per consentire al programmatore di verificare che venga codificato il numero adeguato di commit per il decremento del valore di @@TRANCOUNT a 0 e che venga quindi eseguito il commit della transazione esterna.

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