BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

S’applique à : SQL Server Azure SQL Managed Instance

Spécifie le début d'une transaction distribuée Transact-SQL. Lorsque vous utilisez SQL Server, la transaction distribuée est gérée par Microsoft Distributed Transaction Coordinator (MS DTC).

  • Dans le cas d’Azure SQL Managed Instance, la transaction distribuée est gérée par le service lui-même et non par MS DTC. Pour plus d’informations sur les transactions distribuées dans Azure SQL Database et Azure SQL Managed Instance, consultez Transactions distribuées entre bases de données cloud.

Conventions de la syntaxe Transact-SQL

Syntaxe

BEGIN DISTRIBUTED { TRAN | TRANSACTION }
     [ transaction_name | @tran_name_variable ]
[ ; ]

Arguments

transaction_name

Nom de transaction, défini par l'utilisateur, qui est utilisé pour suivre la transaction distribuée dans les utilitaires MS DTC. transaction_name doit suivre les règles applicables aux identificateurs et comporter un nombre <= à 32 caractères.

@tran_name_variable

Nom d'une variable définie par l'utilisateur qui contient un nom de transaction utilisé pour suivre la transaction distribuée dans les utilitaires MS DTC. La variable doit être déclarée avec un type de données char, varchar, nchar ou nvarchar.

Remarques

L'instance de Moteur de base de données SQL Server exécutant l'instruction BEGIN DISTRIBUTED TRANSACTION est le créateur de la transaction et contrôle également l'exécution jusqu'à son terme. Si une instruction COMMIT TRANSACTION ou ROLLBACK TRANSACTION est ensuite émise pour la session, l'instance de contrôle demande à MS DTC de gérer l'exécution de la transaction distribuée sur toutes les instances concernées.

L'isolement d'instantané au niveau de la transaction ne prend pas en charge les transactions distribuées.

Le plus souvent, les instances distantes du Moteur de base de données sont inscrites dans une transaction distribuée lorsqu'une session déjà inscrite dans cette transaction exécute une requête distribuée référençant un serveur lié.

Par exemple, si BEGIN DISTRIBUTED TRANSACTION est émis sur ServerA, la session appelle une procédure stockée sur ServerB et une autre sur ServerC. La procédure stockée sur ServerC exécute alors une requête distribuée sur ServerD, et les quatre ordinateurs se trouvent impliqués dans la transaction distribuée. L'instance du Moteur de base de données sur ServerA est l'instance qui crée la transaction et contrôle son exécution.

Les sessions intervenant dans les transactions Transact-SQL distribuées n'obtiennent pas d'objet de transaction qu'elles peuvent transmettre à une autre session pour que celle-ci soit explicitement inscrite dans la transaction distribuée. La seule façon pour un serveur distant de s'inscrire dans une transaction est d'être la cible d'une requête distribuée ou d'un appel de procédure stockée distante.

Quand une requête distribuée est exécutée dans une transaction locale, celle-ci est automatiquement promue en transaction distribuée si la source de données OLE DB cible prend en charge ITransactionLocal. Si la source de données OLE DB cible ne prend pas en charge ITransactionLocal, seules les opérations de lecture sont autorisées dans la requête distribuée.

Une session déjà inscrite dans la transaction distribuée effectue un appel de procédure distante faisant référence à un serveur distant.

L’option sp_configure remote proc trans détermine si les appels aux procédures stockées distantes dans une transaction locale entraînent automatiquement la promotion de celle-ci en transaction distribuée gérée par MS DTC. REMOTE_PROC_TRANSACTIONS est une option SET au niveau de la connexion utilisable pour remplacer la valeur par défaut de l’instance définie par sp_configure remote proc trans. Quand cette option est activée, un appel de procédure stockée à distance entraîne la promotion de la transaction locale en une transaction distribuée. Le serveur qui crée la transaction MS DTC devient l'émetteur de la transaction. COMMIT TRANSACTION déclenche une validation coordonnée MS DTC. Si l’option sp_configure remote proc trans est activée, les appels de procédures stockées à distance contenus dans les transactions locales sont automatiquement protégés dans le cadre des transactions distribuées, et cela sans qu’il soit nécessaire de réécrire les applications pour définir explicitement un BEGIN DISTRIBUTED TRANSACTION à la place d’un BEGIN TRANSACTION.

Pour plus d'informations sur l'environnement et le traitement des transactions distribuées, consultez la documentation de Microsoft Distributed Transaction Coordinator (MSDTC).

Autorisations

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

Exemples

Cet exemple supprime un candidat de la base de données AdventureWorks2022 à la fois sur l’instance locale du moteur de base de données et sur une instance située sur un serveur distant. Ces deux bases locale et distante vont soit valider soit annuler la transaction.

Notes

Cet exemple provoque un message d'erreur, sauf si MS DTC est actuellement installé sur l'ordinateur qui exécute l'instance du Moteur de base de données. Pour plus d'informations sur l'installation de MS DTC, consultez la documentation de Microsoft Distributed Transaction Coordinator.

USE AdventureWorks2022;
GO
BEGIN DISTRIBUTED TRANSACTION;
-- Delete candidate from local instance.
DELETE AdventureWorks2022.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
-- Delete candidate from remote instance.
DELETE RemoteServer.AdventureWorks2022.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
GO

Étapes suivantes