5

J'ai une application que j'aimerais prendre en charge SQL Server Mirroring. Cependant, l'architecture est actuellement telle que plusieurs services WCF et connexions DB seront enrôlés dans une seule transaction MSDTC, et Microsoft déclare que MSDTC n'est pas pris en charge lors de l'utilisation de la mise en miroir.Pourquoi MSDTC n'est-il pas pris en charge lors de l'utilisation de SQL Server Mirroring & Automatic Failover?

Their explanation est pas très instructif:

Un scénario similaire peut se produire lorsque vous utilisez la base de données mise en miroir avec des transactions MS DTC. Par exemple, le nouveau serveur principal contacte le MS DTC après un basculement. Cependant, le MS DTC n'a aucune connaissance du nouveau serveur principal. Par conséquent, le MS DTC arrête toutes les transactions qui se trouvent dans la phase «préparation à la validation», même si les transactions sont considérées comme validées dans d'autres bases de données.

Ce que j'ai un problème de compréhension est la dernière phrase. En quoi est-ce différent que si le serveur de base de données n'était pas en miroir, et est juste mort au même moment? Quelqu'un peut-il m'expliquer cela? Je dois pouvoir expliquer cela à d'autres personnes de mon organisation (ainsi qu'aux clients), mais je ne comprends pas pourquoi MSDTC peut correctement restaurer/compenser dans un scénario, mais cela n'est pas possible si l'un des participants est un serveur SQL en miroir (en mode de sécurité totale).

Répondre

7

MSDTC n'est pas conscient de la mise en miroir. Donc, quand il inscrit un gestionnaire de ressources dans une transaction distribuée, il connaîtra RM par son nom, disons le serveur A. Après un basculement, le journal indiquera au nouveau principal 'contacter le DTC et voir quel est le statut de la transaction T '. Le nouveau principal, nommé serveur B, va à la DTC et dit: «Je suis le serveur B, quel est le résultat de la transaction T? et le CPD lui dira: «Va-t'en, je ne te connais pas, tu n'es pas inscrit à la transaction T». C'est ce que le KB article décrit aussi:

Après un basculement, le nouveau serveur principal ne peut pas se connecter à MS DTC de le serveur principal précédent que utilise le même ID de ressource. Par conséquent, le nouveau serveur principal ne peut pas obtenir le statut de la transaction

Vous demandez: « Comment est-ce différent que si le serveur DB n'a pas été en miroir, et vient de mourir à ce même moment? ». La différence est que si cela se produisait, alors la base de données est récupérée, elle sera récupérée sur le même serveur et ce serveur peut contacter le DTC et lui demander d'annuler la transaction distribuée dans laquelle il a été inscrit.

+0

MSDTC aurait-il annulé les autres ressources? Ou cette transaction distribuée attend-elle jusqu'à ce que le serveur d'origine revienne? Que fait le partenaire en miroir lorsque MSDTC l'ignore (annuler? Commit? Lancer une erreur?) –

+2

En cas de validation en deux phases, il y a un état dans lequel DTC ne peut pas agir: après avoir notifié certaines RM à valider. À ce moment-là, le DTC ne peut pas changer d'avis sur le résultat de la transaction, et c'est le moment de l'échec. Si le basculement se produit avant ce moment, alors c'est simple: demandez à tous les autres RM de revenir en arrière, ce n'est pas grave. –

+0

Alors disons qu'il y a 3 RM impliqués. Nous arrivons à la phase que vous avez mentionnée, et on dit à RM1 de s'engager. RM2 est notre serveur SQL, et puisqu'il a échoué, il ne peut pas être atteint. Qu'arrive-t-il à RM3? Est-il dit de commettre? Combien de temps cette transaction distribuée traîne-t-elle si le serveur d'origine ne revient jamais pour lui dire de revenir en arrière? La transaction a-t-elle été conclue avec le partenaire miroir ou non? S'il y a quelque part où je peux aller en apprendre plus à ce sujet, veuillez me diriger. Je n'ai pas été capable de trouver beaucoup sur ce sujet par moi-même. Merci pour votre aide, aussi! –