BEGIN TRANSACTION (Transact-SQL)

Indique le début d'une transaction locale explicite. L'instruction BEGIN TRANSACTION incrémente de 1 la variable @@TRANCOUNT.

Icône Lien de rubriqueConventions de la syntaxe de Transact-SQL

Syntaxe

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

Arguments

  • transaction_name
    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.

  • @tran\_name\_variable
    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' ]
    Indique que la transaction est marquée dans le journal. description est une chaîne qui décrit la marque. Si description est une chaîne Unicode, les valeurs de plus de 255 caractères sont tronquées à 255 caractères avant d'être stockées dans la table msdb.dbo.logmarkhistory. Si description n'est pas une chaîne Unicode, les valeurs de plus de 510 caractères sont tronquées à 510 caractères.

    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.

Notes

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 un COMMIT TRANSACTION, soit par un 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).

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 Utilisation des transactions marquées (mode de sauvegarde 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é à la 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

A. Attribution d'un nom à une transaction

L'exemple suivant montre comment nommer une transaction.

DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;
USE AdventureWorks;
DELETE FROM AdventureWorks.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;
GO

B. Marquage d'une transaction

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 AdventureWorks;
GO
DELETE FROM AdventureWorks.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO