Почему MSDTC не поддерживается при использовании зеркального отображения SQL Server и автоматического перехода на другой ресурс? - PullRequest
5 голосов
/ 12 июля 2010

У меня есть приложение, которое я хотел бы, чтобы поддержка зеркального отображения SQL Server. Однако в настоящее время архитектура такова, что несколько служб WCF и подключений к БД будут зачислены в одну транзакцию MSDTC, и Microsoft заявляет, что MSDTC не поддерживается при использовании зеркального отображения.

Их объяснение не очень информативно:

Подобный сценарий может возникнуть при использовании зеркального отображения базы данных с транзакциями MS DTC. Например, новый основной сервер связывается с MS DTC после аварийного переключения. Однако MS DTC не знает о новом главном сервере. Поэтому MS DTC останавливает все транзакции, находящиеся в фазе «подготовки к принятию», даже если транзакции считаются подтвержденными в других базах данных.

У меня проблемы с пониманием, это последнее предложение. Чем это отличается от того, что сервер БД не был отражен, а просто умер в тот же момент времени? Может кто-нибудь объяснить это мне? Мне нужно иметь возможность объяснить это другим в моей организации (а также клиентам), но я не понимаю, почему MSDTC может правильно выполнить откат / компенсацию в одном сценарии, но не может, если один из участников является зеркальным сервером SQL (в режиме полной безопасности).

1 Ответ

7 голосов
/ 13 июля 2010

MSDTC не знает о зеркалировании.Поэтому, когда он регистрирует менеджера ресурсов в распределенной транзакции, он узнает, что RM по его имени, скажем, Server A. После того, как произойдет переключение при сбое, журнал сообщит новому принципалу «Перейти к DTC и посмотреть, каково состояние транзакции T».Новый принципал, названный Сервер B, идет к DTC и говорит: «Я сервер B, каков результат транзакции T?»и DTC скажет ему: «Уходите, я вас не знаю, вы не зачислены в транзакцию T».Это то, что также описано в статье базы знаний:

После отработки отказа новый основной сервер не может подключиться к MS DTC предыдущего основного сервера, который использует тот же идентификатор ресурса.Поэтому новый основной сервер не может получить статус транзакции

. Вы спрашиваете: «Чем это отличается от того, что сервер БД не был зеркально отражен, а просто умер в тот же момент времени?».Разница в том, что если это произойдет, то когда база данных будет восстановлена, она будет восстановлена ​​на на том же сервере , и этот сервер сможет связаться с DTC и попросить откатить распределеннуюсделка, в которой он был зачислен.

...