COMMIT TRANSACTION (Transact-SQL)
S’applique à : ENTREPÔT PDW (SQL Database) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) 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.
A. 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));