COMMIT TRANSACTION (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Entrepôt dans Microsoft Fabric

Marque la fin d'une transaction implicite ou explicite réussie. Si @@TRANCOUNT a la valeur 1, COMMIT TRANSACTION rend permanentes toutes les modifications de données effectuées dans la base de données depuis le début de la transaction, libère les ressources détenues par la transaction et décrémente @@TRANCOUNT à 0. Lorsque @@TRANCOUNT est supérieur à 1, COMMIT TRANSACTION décrémente @@TRANCOUNT de 1 seulement et la transaction reste active.

Conventions de la syntaxe Transact-SQL

Syntaxe

-- Applies to SQL Server (starting with 2008) and Azure SQL Database
  
COMMIT [ { TRAN | TRANSACTION }  [ transaction_name | @tran_name_variable ] ] [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]  
[ ; ]  
-- Applies to Synpase Data Warehouse in Microsoft Fabric, Azure Synapse Analytics and Parallel Data Warehouse Database
  
COMMIT [ TRAN | TRANSACTION ] 
[ ; ]  

Notes

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 et versions antérieures, consultez Versions antérieures de la documentation.

Arguments

transaction_name
S’applique à : SQL Server et Azure SQL Database

Ignoré par le Moteur de base de données SQL Server. transaction_name spécifie un nom de transaction attribué par une instruction BEGIN TRANSACTION antérieure. transaction_name doit être conforme aux règles applicables aux identificateurs, mais ne doit pas comporter plus de 32 caractères. transaction_name indique aux programmeurs l’instruction BEGIN TRANSACTION imbriquée à laquelle l’instruction COMMIT TRANSACTION est associée.

@tran_name_variable
S’applique à : SQL Server et Azure SQL Database

Nom d'une variable définie par l'utilisateur et contenant un nom de transaction valide. La variable doit être déclarée avec un type de données char, varchar, nchar ou nvarchar. Si plus de 32 caractères sont passés à la variable, seuls 32 caractères sont utilisés ; les autres caractères sont tronqués.

DELAYED_DURABILITY
S’applique à : SQL Server et Azure SQL Database

Option qui demande que cette transaction soit validée avec une durabilité différée. La demande est ignorée si la base de données a été modifiée avec DELAYED_DURABILITY = DISABLED ou DELAYED_DURABILITY = FORCED. Pour plus d’informations, consultez Contrôler la durabilité d’une transaction.

Notes

Il incombe au programmeur Transact-SQL de n’émettre une instruction COMMIT TRANSACTION qu’au moment où toutes les données référencées par la transaction sont logiquement correctes.

Si la transaction validée est une transaction Transact-SQL distribuée, COMMIT TRANSACTION déclenche MS DTC pour utiliser un protocole de validation en deux phases qui valide tous les serveurs concernés par la transaction. Lorsqu’une transaction locale affecte plusieurs bases de données sur une même instance de Moteur de base de données, celle-ci utilise une validation interne en deux phases pour toutes les bases de données concernées par la transaction.

Dans les transactions imbriquées, la validation des transactions internes ne libère pas les ressources et ne rend pas leurs modifications permanentes. Les modifications de données sont rendues permanentes et les ressources ne sont libérées que lorsque la transaction externe est validée. Chaque instruction COMMIT TRANSACTION exécutée lorsque @@TRANCOUNT est supérieur à 1 décrémente simplement @@TRANCOUNT de 1. Lorsque @@TRANCOUNT atteint 0, la totalité de la transaction externe est validée. L’argument transaction_name étant ignoré par le Moteur de base de données, l’émission d’une instruction COMMIT TRANSACTION faisant référence au nom d’une transaction externe tandis que des transactions internes sont en attente décrémente @@TRANCOUNT seulement de 1.

L’émission d’une instruction COMMIT TRANSACTION lorsque @@TRANCOUNT est égal à 0 génère un message d’erreur indiquant l’absence d’instruction BEGIN TRANSACTION correspondante.

Il n’est plus possible d’annuler une transaction une fois l’instruction COMMIT TRANSACTION émise, car les données modifiées sont enregistrées de manière permanente dans la base de données.

Le Moteur de base de données incrémente le nombre de transactions pour une instruction d'une unité seulement lorsque ce nombre est égal à 0 au début de l'instruction.

Autorisations

Nécessite l'appartenance au rôle public .

Exemples

R. Validation d’une transaction

S’applique à : SQL Server, Azure SQL Database, Azure Synapse Analytics et Analytics Platform System (PDW)

L'exemple suivant supprime un candidat à un emploi. Il utilise AdventureWorks.

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

B. Validation d'une transaction imbriquée

S’applique à : SQL Server et Azure SQL Database

L’exemple suivant crée une table, génère trois niveaux de transactions imbriquées, puis valide la transaction imbriquée. Bien que chaque instruction COMMIT TRANSACTION comporte un paramètre transaction_name, il n’existe aucune relation entre les instructions COMMIT TRANSACTION et BEGIN TRANSACTION. Les paramètres transaction_name aident simplement le programmeur à vérifier que le nombre correct de validations a été codé pour décrémenter @@TRANCOUNT jusqu’à 0, ce qui valide la transaction externe.

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

 Voir aussi

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)
@@TRANCOUNT (Transact-SQL)