Share via


BEGIN TRANSACTION (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Entrepôt 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 ROLLBACK l’instructionCOMMIT.

Conventions de la syntaxe Transact-SQL

Syntaxe

Syntaxe pour SQL Server, Azure SQL Database et Azure SQL Managed Instance.

BEGIN { TRAN | TRANSACTION }
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

Syntaxe de Synapse Data Warehouse dans Microsoft Fabric, Azure Synapse Analytics and Analytics Platform System (PDW).

BEGIN { TRAN | TRANSACTION }
[ ; ]

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Arguments

transaction_name

S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure 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...ROLLBACK imbriquéesBEGIN...COMMIT. 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 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 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.

Notes

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 ROLLBACK TRANSACTION une COMMIT 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 DELETE l’exécution d’une INSERTUPDATEinstruction. 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 une UPDATEDELETEinstruction qui fait référence à une table distante sur un serveur lié est exécutée. L’instruction INSERTou l’instruction UPDATEDELETE é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_TRANSACTIONS est définie sur ON.

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.

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 fourni, que vous pouvez télécharger à partir de la page d’accueil Échantillons et projets communautaires Microsoft SQL Server.

A. Utiliser une transaction explicite

S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure 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, 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, 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, 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