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 nel database SQL di Microsoft Fabric 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));