COMMIT TRANSACTION (Transact-SQL)

Marque la fin d'une transaction implicite ou explicite réussie. Si @@TRANCOUNT vaut 1, COMMIT TRANSACTION rend permanentes 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. Si @@TRANCOUNT est supérieur à 1, COMMIT TRANSACTION décrémente @@TRANCOUNT de 1 seulement et la transaction reste active.

Icône Lien de rubriqueConventions de la syntaxe de Transact-SQL

Syntaxe

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

Arguments

  • transaction_name
    Ignoré par le moteur de base de données SQL Server. transaction_name spécifie le nom de transaction attribué par une instruction BEGIN TRANSACTION antérieure. Cet argument transaction_name doit être conforme aux conventions d'affectation de noms applicables aux identificateurs, mais ne doit pas comporter plus de 32 caractères. transaction_name peut faciliter la lecture à des programmeurs en indiquant à quelle instruction BEGIN TRANSACTION imbriquée est associée l'instruction COMMIT TRANSACTION.

  • @tran_name_variable
    Nom d'une variable définie par l'utilisateur et contenant un nom de transaction valide. La variable doit être déclarée avec le 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.

Notes

Il est de la responsabilité des programmeurs Transact-SQL d'émettre une instruction COMMIT TRANSACTION seulement à un 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. Si une transaction locale affecte deux bases de données ou plus sur une même instance du Moteur de base de données, celle-ci utilise une validation interne en deux phases pour valider 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 alors qu'il y a encore des transactions internes en cours, réduit seulement @@TRANCOUNT de 1.

L'émission d'une instruction COMMIT TRANSACTION lorsque @@TRANCOUNT est égal à 0 génère un message d'erreur indiquant qu'il n'y a aucune instruction BEGIN TRANSACTION correspondante.

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

Le Moteur de base de données de SQL Server 2000 et des versions ultérieures 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. Dans SQL Server 7.0, le nombre de transactions est toujours incrémenté, quelle que soit sa valeur au début de l'instruction. Ceci peut avoir comme conséquence que la valeur renvoyée par @@TRANCOUNT dans des déclencheurs est inférieure dans SQL Server 2000 et ultérieur à la valeur dans SQL Server version 7.0.

Dans SQL Server 2000 et ultérieur, si une instruction COMMIT TRANSACTION ou COMMIT WORK est exécutée dans un déclencheur et s'il n'existe pas d'instruction BEGIN TRANSACTION implicite ou explicite correspondante, les utilisateurs peuvent être confrontés à un comportement différent de celui de SQL Server version 7.0. L'insertion d'instructions COMMIT TRANSACTION ou COMMIT WORK dans un déclencheur n'est pas recommandée.

Autorisations

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

Exemples

A. Validation d'une transaction

L'exemple suivant supprime un candidat à un emploi.

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

B. Validation d'une transaction imbriquée

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.

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