Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Entrepôt dans Microsoft Fabric
Base de données SQL dans Microsoft Fabric
Indique le début d'une transaction locale explicite. Les transactions explicites commencent par l’instruction BEGIN TRANSACTION et se terminent par l’instruction ou COMMIT l’instructionROLLBACK.
Conventions de la syntaxe Transact-SQL
Syntax
Syntaxe pour SQL Server, Azure SQL Database, Azure SQL Managed Instance, base de données SQL dans Microsoft Fabric.
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
Syntaxe pour Fabric Data Warehouse, Azure Synapse Analytics et Système de plateforme d’analyse (PDW).
BEGIN { TRAN | TRANSACTION }
[ ; ]
Arguments
transaction_name
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Microsoft Fabric.
Nom attribué à la transaction.
transaction_name devez respecter les règles des identificateurs, mais les identificateurs de plus de 32 caractères ne sont pas autorisés. Utilisez des noms de transaction uniquement sur la paire BEGIN...COMMIT ou BEGIN...ROLLBACK les instructions les plus externes.
transaction_name respecte toujours la casse, même si l’instance du moteur de base de données n’est pas sensible à la casse.
@tran_name_variable
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Microsoft Fabric.
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 les 32 premiers caractères sont utilisés. Les caractères restants sont tronqués.
AVEC MARK [ 'description' ]
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Microsoft Fabric.
Spécifie que la transaction est marquée dans le journal des transactions.
description est une chaîne qui décrit la marque. Une description supérieure à 128 caractères est tronquée à 128 caractères avant d’être stockée dans la msdb.dbo.logmarkhistory table.
Si WITH MARK elle est utilisée, un nom de transaction doit être spécifié.
WITH MARK permet de restaurer un journal des transactions à un point identifié par la marque.
Remarks
BEGIN TRANSACTION incrémente @@TRANCOUNT par 1.
BEGIN TRANSACTION représente un point auquel les données référencées par une session ont un certain état de cohérence. Toutes les modifications apportées après la BEGIN TRANSACTION restauration des données pour renvoyer les données à cet état de cohérence connu. Chaque transaction dure jusqu’à ce qu’elle COMMIT TRANSACTION soit émise pour apporter les modifications à une partie permanente de la base de données, ou toutes les modifications sont effacées avec une ROLLBACK TRANSACTION instruction.
Une transaction peut être restaurée automatiquement si une erreur d’abandon de transaction se produit ou si une erreur d’exécution se produit et que l’option XACT_ABORT de session est définie ONsur . Pour plus d’informations, consultez SET XACT_ABORT.
BEGIN TRANSACTION démarre une transaction locale pour la session qui émet l’instruction. Selon les paramètres de niveau d’isolation des transactions actuels, les ressources acquises pour prendre en charge les instructions Transact-SQL émises par la session sont verrouillées par la transaction jusqu’à ce qu’elle se termine avec une ou ROLLBACK TRANSACTION une COMMIT TRANSACTION instruction. Les transactions restantes pendant de longues périodes peuvent empêcher d’autres sessions d’accéder à ces ressources verrouillées, et peuvent également empêcher la troncation du journal des transactions et le nettoyage du magasin de versions.
Bien qu’elle BEGIN TRANSACTION démarre une transaction locale, elle n’est pas enregistrée dans le journal des transactions tant que l’application n’effectue pas ensuite une action qui doit être enregistrée dans le journal, telle que l’exécution d’une instruction, ou INSERT l’exécution d’une UPDATEDELETEinstruction. Une fois qu’une transaction est démarrée, le moteur de base de données peut effectuer des actions telles que l’acquisition de verrous pour protéger le niveau d’isolation des SELECT instructions de transaction, mais rien n’est enregistré dans le journal des transactions tant que l’application n’a pas effectué une action de modification.
Après l’émission BEGIN TRANSACTION, vous pouvez émettre BEGIN TRANSACTION à nouveau pour démarrer une ou plusieurs transactions internes. Même si vous pouvez spécifier transaction_name pour une transaction interne, seul le nom de la transaction (à l’extérieur) est inscrit auprès du système. Une restauration vers un autre nom (autre qu’un nom de point d’enregistrement valide) génère une erreur sans annuler l’une des instructions. Les instructions ne sont annulées que lorsque l'instruction extérieure est elle-même annulée.
La transaction locale démarrée par l’instruction BEGIN TRANSACTION est promue vers une transaction distribuée si les actions suivantes sont effectuées avant la validation ou la restauration de l’instruction :
Une
INSERTinstruction ou uneDELETEUPDATEinstruction qui fait référence à une table distante sur un serveur lié est exécutée. L’instructionINSERTou l’instructionUPDATEDELETEéchoue si le fournisseur OLE DB utilisé pour accéder au serveur lié ne prend pas en charge l’interfaceITransactionJoin.Un appel est effectué vers une procédure stockée distante lorsque l’option
REMOTE_PROC_TRANSACTIONSest définie surON.
L’instance du moteur de base de données local devient le contrôleur de transaction et utilise Microsoft Distributed Transaction Coordinator (MS DTC) pour gérer la transaction distribuée.
Une transaction peut être exécutée explicitement en tant que transaction distribuée à l’aide BEGIN DISTRIBUTED TRANSACTIONde . Pour plus d’informations, consultez BEGIN DISTRIBUTED TRANSACTION.
Lorsque SET IMPLICIT_TRANSACTIONS la valeur est définie ON, une BEGIN TRANSACTION instruction crée une transaction externe et interne, avec la valeur @@TRANCOUNT 2. Pour plus d'informations, consultez SET IMPLICIT_TRANSACTIONS.
Note
Le moteur de base de données ne prend pas en charge les transactions imbriquées gérables indépendamment. Une validation d’une transaction interne décrémente @@TRANCOUNT mais n’a aucun autre effet. Une restauration d’une transaction interne restaure toujours la transaction externe, sauf si un point d’enregistrement existe et est spécifié dans l’instruction ROLLBACK .
Transactions marquées
L’option WITH MARK entraîne l’enregistrement du nom de la transaction dans le journal des transactions. Lorsque vous restaurez une base de données à un état antérieur, la transaction marquée peut être utilisée pour spécifier le point de restauration au lieu d’une date et d’une heure. Pour plus d’informations, consultez Utiliser des transactions marquées pour récupérer des bases de données associées de manière cohérente et des instructions RESTORE.
En outre, les marques de journal des transactions sont nécessaires si vous devez récupérer un ensemble de bases de données associées à un état partagé de cohérence spécifique. Une application qui connaît l’état de cohérence de chaque base de données peut placer des marques dans les journaux des transactions des bases de données associées à l’aide d’une base de données croisée ou d’une transaction distribuée. La récupération de l’ensemble de bases de données associées à ces marques entraîne un ensemble de bases de données qui ont un état partagé connu de cohérence.
La marque n'est placée dans le journal des transactions que si la base de données est mise à jour par la transaction marquée. Les transactions qui ne modifient pas les données ne sont pas enregistrées dans le journal.
BEGIN TRANSACTION <new_name> WITH MARK peut être utilisé lors du démarrage d’une transaction interne. Dans ce cas, <new_name> devient le nom de marque de la transaction si la transaction externe n’est pas marquée. Dans l’exemple conceptuel suivant, M2 est le nom de la marque.
BEGIN TRAN T1;
UPDATE table1 ...;
BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT column1 FROM table1;
COMMIT TRAN M2;
UPDATE table3 ...;
COMMIT TRAN T1;
Lorsque vous marquez une transaction interne, vous recevez le message d’avertissement suivant si vous essayez de marquer une transaction déjà marquée :
Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.
Permissions
Nécessite l’appartenance au rôle public.
Examples
Les exemples de code de cet article utilisent les bases de données d'exemple AdventureWorks2025 ou AdventureWorksDW2025, que vous pouvez télécharger à partir de la page d'accueil Microsoft SQL Server Samples and Community Projects.
A. Utiliser une transaction explicite
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Microsoft Fabric, Azure Synapse Analytics, Analytics Platform System (PDW)
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
B. Restaurer une transaction
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Microsoft Fabric, Azure Synapse Analytics, Analytics Platform System (PDW)
L’exemple suivant montre l’effet de la restauration d’une transaction. Dans cet exemple, l’instruction ROLLBACK restaure l’instruction INSERT , mais la table créée existe toujours.
CREATE TABLE ValueTable
(
id INT
);
BEGIN TRANSACTION;
INSERT INTO ValueTable VALUES (1);
INSERT INTO ValueTable VALUES (2);
ROLLBACK;
C. Nommer une transaction
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Microsoft Fabric
L'exemple suivant montre comment nommer une transaction.
DECLARE @TranName AS VARCHAR (20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
D. Marquer une transaction
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, SQL Database dans Microsoft Fabric
L'exemple suivant montre comment marquer une transaction. La transaction CandidateDelete est marquée.
BEGIN TRANSACTION CandidateDelete
WITH MARK N'Deleting a Job Candidate';
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION CandidateDelete;
Contenu connexe
- DÉMARRER LA TRANSACTION DISTRIBUÉE (Transact-SQL)
- TRANSACTION COMMIT (Transact-SQL)
- COMMIT DU TRAVAIL (Transact-SQL)
- ANNULATION DE LA TRANSACTION (Transact-SQL)
- TRAVAIL DE RETOUR EN ARRIÈRE (Transact-SQL)
- SAUVEGARDER LA TRANSACTION (Transact-SQL)
- Guide du verrouillage des transactions et du contrôle de version de ligne