Transactions distribuées Transact-SQL
Les transactions distribuées démarrées à l'aide de Transact-SQL ont une structure relativement simple :
Un script Transact-SQL ou une connexion d'application exécute une instruction Transact-SQL démarrant une transaction distribuée.
L'instance du Moteur de base de données SQL Server qui exécute cette instruction devient serveur de contrôle de la transaction.
Le script ou l'application exécute alors des requêtes distribuées sur des serveurs liés, ou des procédures stockées distantes sur des serveurs distants.
Au moment de l'exécution des requêtes distribuées et des appels de procédure distante, le serveur de contrôle appelle automatiquement MS DTC (Microsoft Distributed Transaction Coordinator) pour inscrire les serveurs liés et distants dans la transaction distribuée.
Lorsque le script ou l'application exécute une instruction COMMIT ou ROLLBACK, l'instance de SQL Server de contrôle appelle MS DTC pour gérer le processus de validation en deux phases ou pour notifier les serveurs liés et distants qu'ils doivent restaurer leurs transactions.
Instructions Transact-SQL requises
Les instructions Transact-SQL qui permettent de contrôler les transactions distribuées sont peu nombreuses, car la plus grande partie du travail est effectuée de manière interne par le Moteur de base de données SQL Server et par MS DTC. Les seules instructions Transact-SQL requises dans le script ou l'application Transact-SQL sont celles qui permettent d'effectuer les opérations suivantes :
démarrer une transaction distribuée ;
effectuer des requêtes distribuées sur des serveurs liés ou exécuter des appels de procédure distante sur des serveurs distants ;
appeler les instructions standard Transact-SQL COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION ou ROLLBACK WORK pour terminer la transaction.
Pour chaque transaction distribuée Transact-SQL, l'instance du Moteur de base de données qui traite le script ou la connexion Transact-SQL appelle automatiquement MS DTC pour coordonner la validation ou la restauration de la transaction.
Démarrage des transactions distribuées
Transact-SQL vous permet de démarrer des transactions distribuées des façons suivantes :
En démarrant une transaction distribuée explicite avec l'instruction BEGIN DISTRIBUTED TRANSACTION.
Vous pouvez également exécuter une requête distribuée sur un serveur lié. L'instance du Moteur de base de données à laquelle vous êtes connecté fait appel à MS DTC pour gérer la transaction distribuée sur le serveur lié. Vous pouvez également appeler des procédures stockées distantes sur une instance du Moteur de base de données distante au cours d'une transaction distribuée.
En exécutant une requête distribuée dans une transaction locale.
Si la source de données OLE DB prend en charge l'interface ITransactionJoin, la transaction devient une transaction distribuée, même si la requête est en lecture seule. Si la source de données ne prend pas en charge ITransactionJoin, seules des instructions de lecture seule sont autorisées.
Si l'instruction SET REMOTE_PROC_TRANSACTIONS ON a été exécutée et si une transaction locale appelle une procédure stockée distante sur une autre instance du Moteur de base de données, la transaction locale devient une transaction distribuée.
Le Moteur de base de données utilise MS DTC pour coordonner la transaction avec le serveur distant. Les appels à des procédures stockées distantes sont exécutés hors de l'étendue d'une transaction locale si REMOTE_PROC_TRANSACTIONS a pour valeur OFF. Le travail effectué par la procédure distante n'est pas restauré si la transaction locale est restaurée. Ce travail est validé au moment où la procédure se termine, et non après la validation de la transaction locale.
REMOTE_PROC_TRANSACTIONS est une option de compatibilité qui affecte uniquement les appels de procédure stockée distante émis vers des serveurs distants définis à l'aide de l'option sp_addserver. Cette option ne s'applique pas aux requêtes distribuées qui exécutent une procédure stockée sur un serveur lié défini à l'aide de l'option sp_addlinkedserver. Pour plus d'informations sur les requêtes distribuées, consultez Requêtes distribuées.