Requêtes distribuées et transactions distribuées
Le Moteur de base de données SQL Server vous permet de créer des liaisons avec des sources de données OLE DB appelées serveurs liés. Lorsque vous avez créé une liaison avec une source de données OLE DB, vous pouvez effectuer les opérations suivantes :
faire référence à des ensembles de lignes de sources de données OLE DB en tant que tables dans les instructions Transact-SQL ;
- transmettre des commandes aux sources de données OLE DB en incluant les ensembles de lignes résultants sous forme de tables dans les instructions Transact-SQL.
Une requête distribuée peut faire référence à plusieurs serveurs liés et effectuer des opérations de modification ou de lecture sur chacun d'eux. Une même requête distribuée peut effectuer des opérations de lecture sur certains serveurs liés et des opérations de modification sur d'autres. En règle générale, Moteur de base de données requiert que le fournisseur OLE DB correspondant soit à même de prendre en charge les transactions distribuées dès que des données émanant de plusieurs serveurs liés sont susceptibles d'être mises à jour dans une transaction. Les types de requêtes que vous pouvez prendre en charge sur des serveurs liés dépendent donc du niveau de prise en charge des transactions dont disposent les fournisseurs OLE DB. OLE DB définit deux interfaces facultatives pour la gestion des transactions :
- ITransactionLocal qui prend en charge les transactions locales dans la source de données OLE DB.
- ITransactionJoin qui permet à un fournisseur de participer à une transaction distribuée qui met en jeu d'autres gestionnaires de ressources.
Tous les fournisseurs qui prennent en charge ITransactionJoin prennent également en charge ITransactionLocal.
Si une requête distribuée est exécutée lorsque la connexion est en mode de validation automatique, les règles suivantes s'appliquent :
- Seules les opérations de lecture sont autorisées sur les fournisseurs qui ne prennent pas en charge ITransactionLocal.
- Toutes les opérations de modification sont autorisées sur les fournisseurs qui prennent en charge ITransactionLocal.
L'instance de contrôle du Moteur de base de données appelle automatiquement ITransactionLocal sur chaque serveur lié qui participe à une opération de modification pour démarrer une transaction locale. Elle valide les modifications si l'instruction réussit, ou les restaure en cas d'échec.
Lorsqu'une requête distribuée porte sur une vue partitionnée distribuée ou est exécutée sur une connexion en mode de transaction explicite ou implicite, les règles suivantes s'appliquent :
- Seules les opérations de lecture sont autorisées sur les fournisseurs qui ne prennent pas en charge ITransactionJoin. Les fournisseurs qui ne prennent en charge aucune transaction ou prennent seulement en charge ITransactionLocal ne peuvent pas prendre part à des opérations de modification.
- Si SET XACT_ABORT a pour valeur ON, toutes les opérations de modification sont autorisées sur les fournisseurs qui prennent en charge ITransactionJoin. L'instance de contrôle du Moteur de base de données appelle automatiquement ITransactionJoin sur chaque serveur lié qui participe à une opération de modification afin de le mettre en œuvre dans la transaction distribuée. MS DTC (Microsoft Distributed Transaction Coordinator) valide ou restaure les modifications suivant que le serveur de contrôle indique une validation ou une restauration de la transaction.
- Si SET XACT_ABORT a pour valeur OFF, le serveur lié doit également prendre en charge les transactions imbriquées pour que les opérations de modification soient autorisées. Les transactions imbriquées sont prises en charge si le fournisseur prend en charge l'appel à ITransactionLocal::StartTransaction lorsqu'il existe déjà une transaction ouverte dans la session. SQL Server peut alors restaurer une par une les instructions d'une requête distribuée sans restaurer toute la transaction.
Les règles précédentes impliquent la restriction suivante pour les fournisseurs qui ne prennent pas en charge les transactions imbriquées : les opérations de mise à jour sont autorisées dans une transaction distribuée uniquement si l'option XACT_ABORT a pour valeur ON.