Почему MSDTC не поддерживается при использовании зеркального отображения SQL Server и автоматического перехода на другой ресурс?
У меня есть приложение, которое я хотел бы иметь поддержку зеркального отображения SQL Server. Однако в настоящее время архитектура такова, что несколько служб WCF и подключений к БД будут зачислены в одну транзакцию MSDTC, и Microsoft заявляет, что MSDTC не поддерживается при использовании зеркалирования.
Их объяснение не очень информативно:
Аналогичный сценарий может возникнуть при использовании зеркального отображения базы данных с транзакциями MS DTC. Например, новый основной сервер связывается с MS DTC после аварийного переключения. Однако MS DTC не знает о новом главном сервере. Поэтому MS DTC останавливает все транзакции, которые находятся в фазе "подготовки к принятию", даже если транзакции считаются подтвержденными в других базах данных.
У меня проблемы с пониманием, это последнее предложение. Чем это отличается от того, что сервер БД не был отражен, а просто умер в тот же момент времени? Может кто-нибудь объяснить это мне? Мне нужно иметь возможность объяснить это другим в моей организации (а также клиентам), но я не понимаю, почему MSDTC может правильно выполнить откат / компенсацию в одном сценарии, но не может, если один из участников является зеркальным сервером SQL (в режиме полной безопасности).
1 ответ
MSDTC не знает о зеркалировании. Поэтому, когда он регистрирует диспетчер ресурсов в распределенной транзакции, он узнает, что RM по его имени, скажем, Server A. После того, как произойдет аварийное переключение, журнал сообщит новому принципалу "пойти в контакт DTC и посмотреть, каково состояние транзакции T". ". Новый принципал, названный Сервер B, идет к DTC и говорит: "Я сервер B, каков результат транзакции T?" и DTC скажет ему: "Уходите, я вас не знаю, вы не зачислены в транзакцию T". Это то, что описывает статья KB:
После отработки отказа новый основной сервер не может подключиться к MS DTC предыдущего основного сервера, который использует тот же идентификатор ресурса. Следовательно, новый основной сервер не может получить статус транзакции.
Вы спрашиваете: "Чем это отличается от того, что сервер БД не был отражен, а просто умер в тот же момент времени?". Разница в том, что если бы это произошло, то при восстановлении базы данных она будет восстановлена на том же сервере, и этот сервер может связаться с DTC и попросить откатить распределенную транзакцию, в которой она была зарегистрирована.