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 avec l’instruction BEGIN TRANSACTION et se terminent avec l’instruction COMMIT ou ROLLBACK.

Conventions de la syntaxe Transact-SQL

Syntaxe

--Applies to SQL Server and Azure SQL Database
 
BEGIN { TRAN | TRANSACTION }   
    [ { transaction_name | @tran_name_variable }  
      [ WITH MARK [ 'description' ] ]  
    ]  
[ ; ]  
--Applies to Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics and Parallel Data Warehouse
 
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

Nom attribué à la transaction. transaction_name doit respecter les règles applicables aux identificateurs, mais les identificateurs de plus de 32 caractères ne sont pas autorisés. Utilisez les noms de transaction seulement sur la paire la plus extérieure des instructions BEGIN...COMMIT ou BEGIN...ROLLBACK imbriquées. transaction_name respecte toujours la casse, même si l’instance de SQL Server n’en tient pas compte.

@tran_name_variable
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database

Nom d'une variable définie par l'utilisateur et 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 seront utilisés et les autres seront tronqués.

WITH MARK [ 'description' ]
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database

Indique que la transaction est marquée dans le journal. description est une chaîne qui décrit la marque. Une description de plus de 128 caractères est tronquée à 128 caractères avant d’être stockée dans la table msdb.dbo.logmarkhistory.

Si WITH MARK est utilisé, un nom de transaction doit être spécifié. WITH MARK permet de restaurer un journal de transactions par rapport à une marque nommée.

Remarques d'ordre général

L'instruction BEGIN TRANSACTION incrémente de 1 la variable @@TRANCOUNT.

BEGIN TRANSACTION représente le point auquel les données référencées par une connexion sont logiquement et physiquement cohérentes. Si des erreurs sont détectées, toutes les modifications apportées aux données après l'exécution de l'instruction BEGIN TRANSACTION peuvent être annulées afin que les données reviennent à cet état connu de cohérence. Une transaction se poursuit jusqu'à ce qu'elle se termine sans erreur et que l'instruction COMMIT TRANSACTION soit émise pour que les modifications soient intégrées de façon permanente à la base de données ou bien jusqu'à ce que des erreurs soient rencontrées, auquel cas les modifications sont effacées à l'aide de l'instruction ROLLBACK TRANSACTION.

L'instruction BEGIN TRANSACTION démarre une transaction locale pour la connexion qui a émis cette instruction. Selon les paramètres de niveau d'isolement définis pour la transaction en cours, de nombreuses ressources acquises pour la prise en charge des instructions Transact-SQL émises par la connexion sont verrouillées par la transaction jusqu'à ce que celle-ci se termine soit par une instruction COMMIT TRANSACTION, soit par une instruction ROLLBACK TRANSACTION. 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 que BEGIN TRANSACTION démarre une transaction locale, celle-ci n'est pas enregistrée dans le journal des transactions avant que l'application n'effectue une action qui doit y être consignée, telle que l'exécution d'une instruction INSERT, UPDATE ou DELETE. Une application peut effectuer des actions telles que l'acquisition de verrous afin de protéger le niveau d'isolement d'une transaction des instructions SELECT, mais rien n'est enregistré dans le journal avant que l'application n'effectue 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 lancée par l'instruction BEGIN TRANSACTION est promue au rang de transaction distribuée si les actions suivantes sont effectuées avant que cette transaction soit validée ou annulée :

  • Exécution d'une instruction INSERT, DELETE ou UPDATE faisant référence à une table distante ou à un serveur lié. L’instruction INSERT, UDPATE ou DELETE échoue si le fournisseur OLE DB utilisé pour l’accès au serveur lié ne prend pas en charge l’interface ITransactionJoin.

  • Un appel à une procédure stockée distante est effectué quand l'option REMOTE_PROC_TRANSACTIONS a la valeur ON.

La copie locale de SQL Server devient le contrôleur de transaction et utilise Microsoft DTC pour gérer la transaction distribuée.

Vous pouvez exécuter explicitement une transaction en tant que transaction distribuée en utilisant BEGIN DISTRIBUTED TRANSACTION. Pour plus d’informations, consultez BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Si SET IMPLICIT_TRANSACTIONS a la valeur ON, une instruction BEGIN TRANSACTION crée deux transactions imbriquées. Pour plus d’informations, consultez SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Transactions marquées

L'option WITH MARK permet de placer le nom de la transaction dans le journal des transactions. Lors de la restauration d'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 les transactions marquées pour récupérer des bases de données associées uniformément (mode de récupération complète) et RESTORE (Transact-SQL).

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 de données ne sont pas marquées.

BEGIN TRAN new_name WITH MARK peut être imbriquée dans une transaction existante non marquée. new_name devient alors le nom de marque de la transaction, malgré le nom éventuellement déjà affecté à cette transaction. 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;  

Lors de l'imbrication de transactions, si vous essayez de marquer une transaction déjà marquée, vous obtenez un message d'avertissement (et non pas d'erreur) :

« BEGIN TRAN T1 WITH MARK ...; »

« UPDATE table1 ...; »

« BEGIN TRAN M2 WITH MARK ...; »

« Serveur : Msg 3920, Niveau 16, État 1, Ligne 3 »

« L'option WITH MARK s'applique uniquement à la première instruction BEGIN TRAN WITH MARK. »

« L'option est ignorée. »

Autorisations

Nécessite l'appartenance au rôle public.

Exemples

R. Utilisation d’une transaction explicite

S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure Synapse Analytics, Parallel Data Warehouse

Cet exemple utilise AdventureWorks.

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 Synapse Analytics, Parallel Data Warehouse

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 continue d’exister.

CREATE TABLE ValueTable (id INT);  
BEGIN TRANSACTION;  
       INSERT INTO ValueTable VALUES(1);  
       INSERT INTO ValueTable VALUES(2);  
ROLLBACK;  

C. Attribution d'un nom à une transaction

S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database

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. Marquage d'une transaction

S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database

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  

Voir aussi

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)