Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite 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 Preview
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, Fabric SQL Database et Azure SQL Managed Instance.
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, Fabric SQL Database et Azure SQL Managed Instance
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 la plus externe d’instructions imbriquées ou BEGIN...COMMIT imbriquéesBEGIN...ROLLBACK.
transaction_name respecte toujours la casse, même si l’instance de SQL Server n’est pas sensible à la casse.
@tran_name_variable
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Fabric SQL Database et Azure SQL Managed Instance
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.
WITH MARK [ 'description' ]
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Fabric SQL Database et Azure SQL Managed Instance
Indique que la transaction est marquée dans le journal.
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 sur une marque nommée.
Remarks
BEGIN TRANSACTION incrémente @@TRANCOUNT par 1.
BEGIN TRANSACTION représente un point auquel les données référencées par une connexion sont logiquement et physiquement cohérentes. Si des erreurs sont rencontrées, toutes les modifications apportées aux données après la BEGIN TRANSACTION restauration des données peuvent être restaurées pour renvoyer les données à cet état de cohérence connu. Chaque transaction dure jusqu’à ce qu’elle se termine sans erreur et COMMIT TRANSACTION qu’elle soit émise pour apporter aux modifications une partie permanente de la base de données, ou que toutes les modifications sont effacées avec une ROLLBACK TRANSACTION instruction.
BEGIN TRANSACTION démarre une transaction locale pour la connexion qui émet l’instruction. Selon les paramètres de niveau d’isolation des transactions actuels, de nombreuses ressources acquises pour prendre en charge les instructions Transact-SQL émises par la connexion sont verrouillées par la transaction jusqu’à ce qu’elle se termine avec une ou COMMIT TRANSACTION une ROLLBACK TRANSACTION instruction. Les transactions suspendues pendant de longues périodes de temps peuvent empêcher les autres utilisateurs d'accéder à ces ressources verrouillées, et elles peuvent également empêcher la troncature du fichier journal.
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 application peut effectuer des actions telles que l’acquisition de verrous pour protéger le niveau d’isolation des transactions des SELECT instructions, mais rien n’est enregistré dans le journal tant que l’application n’a pas effectué une action de modification.
L'attribution d'un nom à plusieurs transactions d'une série de transactions imbriquées a peu d'effet sur la transaction. En effet, seul le premier nom de transaction (le plus à l'extérieur) est inscrit avec le système. Une annulation vers tout autre nom (autre que celui d'un point de sécurité valide) génère une erreur. Dans ce cas, aucune des instructions exécutées avant l'annulation n'est en fait annulée au moment où l'erreur se produit. 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 réaffectée à 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.
La copie locale de SQL Server devient le contrôleur de transaction et utilise Microsoft 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.
Quand SET IMPLICIT_TRANSACTIONS la valeur est définie ON, une BEGIN TRANSACTION instruction crée deux transactions imbriquées. Pour plus d'informations, consultez SET IMPLICIT_TRANSACTIONS.
Transactions marquées
L’option WITH MARK entraîne le fait que le nom de la transaction soit placé 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 à la place 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 du journal des transactions sont nécessaires pour récupérer un ensemble de bases de données connexes dans un état cohérent d'un point de vue logique. Une transaction distribuée permet de placer des marques dans les journaux de transactions des bases de données connexes. La récupération de l'ensemble de bases de données connexes jusqu'à ces marques aboutit à un ensemble de bases de données cohérent d'un point de vue transactionnel. Le placement de marques dans des bases de données connexes implique des procédures particulières.
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 marquées.
BEGIN TRANSACTION <new_name> WITH MARK peut être imbriqué dans une transaction déjà existante qui n’est pas marquée. Dans ce cas, <new_name> devient le nom de marque de la transaction, malgré le nom que la transaction a déjà été donnée. Dans l'exemple suivant, M2 est le nom de la marque.
BEGIN TRAN T1;
UPDATE table1 ...;
BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT * from table1;
COMMIT TRAN M2;
UPDATE table3 ...;
COMMIT TRAN T1;
Lorsque vous imbriquez des transactions, 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 AdventureWorks2022 ou AdventureWorksDW2022, 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, Fabric SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, Analytics Platform System (PDW)
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT;
B. Restauration d’une transaction
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance, 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, Fabric SQL Database, Azure SQL Managed Instance
L'exemple suivant montre comment nommer une transaction.
DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
USE AdventureWorks2022;
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
GO
D. Marquer une transaction
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Fabric SQL Database, Azure SQL Managed Instance
L'exemple suivant montre comment marquer une transaction. La transaction CandidateDelete est marquée.
BEGIN TRANSACTION CandidateDelete
WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks2022;
GO
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO