COMMIT TRANSACTION (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Warehouse dans microsoft Fabric SQL Database dans Microsoft Fabric SQL Database dans Microsoft Fabric

Marque la fin d'une transaction implicite ou explicite réussie. Si @@TRANCOUNT la valeur est 1, COMMIT TRANSACTION effectue toutes les modifications de données depuis le début de la transaction une partie permanente de la base de données, libère les ressources de la transaction et décrémente @@TRANCOUNT la valeur 0. Lorsqu’elle @@TRANCOUNT est supérieure à 1, COMMIT TRANSACTION décrémente @@TRANCOUNT uniquement par 1 et la transaction reste active.

Conventions de la syntaxe Transact-SQL

Syntaxe

Syntaxe pour SQL Server et Azure SQL Database.

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

Syntaxe de Synapse Data Warehouse dans Microsoft Fabric, Azure Synapse Analytics et Parallel Data Warehouse Database.

COMMIT [ TRAN | TRANSACTION ]
[ ; ]

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 un précédent BEGIN TRANSACTION. 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 auxquels l’imbrication COMMIT TRANSACTION BEGIN TRANSACTION est associée.

@tran_name_variable

S’applique à : SQL Server et Azure SQL Database

Nom d’une variable définie par l’utilisateur 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 caractères restants sont tronqués.

WITH DELAYED_DURABILITY = { OFF | ON }

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 émettre COMMIT TRANSACTION uniquement à un moment où toutes les données référencées par la transaction sont logiquement correctes.

Si la transaction validée était une transaction distribuée Transact-SQL, COMMIT TRANSACTION déclenche MS DTC pour utiliser un protocole de validation en deux phases pour valider tous les serveurs impliqués dans 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 COMMIT TRANSACTION émission est @@TRANCOUNT supérieure à une décrémentation @@TRANCOUNT par 1. Quand @@TRANCOUNT elle est finalement décrémentée à 0, la transaction externe entière est validée. Étant donné que transaction_name est ignoré par l’Moteur de base de données, l’émission d’un COMMIT TRANSACTION référencement du nom d’une transaction externe lorsqu’il n’y a que des transactions internes en attente de décréments @@TRANCOUNT d’ici 1.

L’émission d’un COMMIT TRANSACTION moment où @@TRANCOUNT zéro entraîne une erreur ; il n’y a pas de correspondance BEGIN TRANSACTION.

Vous ne pouvez pas restaurer une transaction après l’émission d’une COMMIT TRANSACTION instruction, car les modifications de données ont été apportées à une partie permanente de 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

Les exemples de code Transact-SQL de cet article sont fondés sur l’échantillon de base de données AdventureWorks2022 ou AdventureWorksDW2022 fourni, que vous pouvez télécharger à partir de la page d’accueil Échantillons et projets communautaires Microsoft SQL Server.

R : Valider 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.

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

B. Valider 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));