Как включить MSDTC на SQL Server?

Это даже правильный вопрос? У меня есть приложение .NET для Windows, которое использует MSTDC и выдает исключение:

System.Transactions.TransactionManagerCommunicationException: доступ к сети для диспетчера распределенных транзакций (MSDTC) отключен. Включите DTC для доступа к сети в конфигурации безопасности для MSDTC с помощью инструмента администрирования служб компонентов ---> System.Runtime.InteropServices.COMException (0x8004D024): Менеджер транзакций отключил свою поддержку удаленных / сетевых транзакций. (Исключение из HRESULT: 0x8004D024) в System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction (UInt32 propgationTokenSize, Byte [] propgationToken, IntPtr Управляемый идентификатор, Идентификатор Guid & транзакции, идентификатор & Транзакция и транзакция).

Я следовал руководству Kbalertz, чтобы включить MSDTC на ПК, на котором установлено приложение, но ошибка все равно возникает.

Мне было интересно, если это проблема с базой данных? Если так, как я могу решить это?

11.08.2008 11:57:17
Если упомянутые решения не решают проблему, проверьте эту ссылку
Shahab J 7.12.2016 23:00:31
6 ОТВЕТОВ

MSDTC должен быть включен в обеих системах, как на сервере, так и на клиенте.
Также убедитесь, что между системами, которые блокируют RPC, нет брандмауэра.
DTCTest - это отличное приложение, которое поможет вам устранить любые другие проблемы.

4
11.08.2008 12:04:11
Я думаю, что это новое местоположение microsoft.com/en-us/download/details.aspx?id=30746
Air2 9.04.2018 14:55:16

Вам вообще нужен MSDTC? Эскалация, которую вы испытываете, часто вызывается созданием нескольких соединений в одной TransactionScope.

Если вам это нужно, вам нужно включить его, как указано в сообщении об ошибке. На XP:

  • Перейдите в Администрирование -> Службы компонентов
  • Развернуть Услуги по компонентам -> Компьютеры ->
  • Щелкните правой кнопкой мыши -> Свойства -> вкладка MSDTC
  • Нажмите кнопку Конфигурация безопасности
102
11.08.2008 12:10:05
Также в брандмауэре Windows я открыл порт 135 TCP и добавил c: \ windows \ msdtc.exe в качестве исключения
Sameer 19.03.2010 19:45:16
Спасибо за комментарий об ошибке, вызванной созданием нескольких соединений в одном TransactionScope. Я получал ошибку, и это была именно проблема. Я не хотел использовать MSDTC, поэтому я нашел ошибочное новое соединение и повторно использовал существующее. Спасибо!
Jim McKeeth 19.04.2010 23:58:55
Я на Windows 7 и 8, и есть только раздел «Координатор по умолчанию». Где я могу получить конфигурацию безопасности, о которой вы говорите?
qdev76 6.03.2014 18:27:58
1) Щелкните правой кнопкой мыши по локальному DTC и выберите свойства. 2) Откройте вкладку безопасности. 3) Проверьте, по крайней мере, доступ к сетевому DTC, Разрешить удаленных клиентов и Разрешить входящие.
Rob Sedgwick 4.06.2015 09:58:47

@Dan,

Не нужно ли включить msdtc для работы транзакций?

Только распределенные транзакции - те, которые связаны с более чем одним соединением. Вдвойне убедитесь, что вы открываете только одно соединение в рамках транзакции, и оно не будет увеличиваться - производительность также будет намного лучше.

4
11.08.2008 23:02:13
Не нужно ли включить msdtc для работы транзакций? В любом случае, насколько мне известно, множественные соединения не выполняются. Я уже выполнил эти шаги на клиентском ПК. Вы говорите, что я должен также выполнить эти шаги на сервере базы данных?
Dan 11.08.2008 12:51:01
@Dan, вам не нужно включать DTC, если вы используете транзакции ado.net. Вы должны включить MSDTC на сервере, только если вы используете распределенные транзакции
Niraj 17.02.2011 12:32:01

Я обнаружил, что лучший способ отладки - использовать инструмент Microsoft под названием DTCPing

  1. Скопируйте файл на сервер (БД) и клиент (сервер приложений / клиентский ПК)
    • Запустите его на сервере и клиенте
    • На сервере: введите имя компьютера netbios клиента и попытайтесь установить соединение DTC
    • Перезапустите оба приложения.
    • На клиенте: введите имя компьютера netbios сервера и попытайтесь установить соединение DTC

У меня была проблема с тарифами в нашей старой корпоративной сети, и у меня есть несколько советов:

  • если вы получаете сообщение об ошибке «Gethostbyname failed», это означает, что компьютер не может найти другой компьютер по его имени netbios . Например, сервер может разрешить и пропинговать клиента, но это работает на уровне DNS. Не на уровне поиска netbios. Использование серверов WINS или изменение LMHOST (грязный) решит эту проблему.
  • Если появляется сообщение «Отказано в доступе», настройки безопасности не совпадают. Вы должны сравнить вкладку безопасности для msdtc и получить соответствие сервера и клиента. Еще одна вещь, на которую стоит обратить внимание - это значение RestrictRemoteClients . В зависимости от версии вашей ОС и, что более важно, пакета обновления, это значение может отличаться.
  • Другие проблемы с подключением:
    • Брандмауэр между сервером и клиентом должен разрешать связь через порт 135. И что более важно, соединение может быть инициировано с обоих сайтов (у меня было много проблем с людьми из брандмауэра в моей компании, потому что они предполагали, что только сервер будет открывать соединение на этот порт)
    • Протокол возвращает случайный порт для подключения к реальной транзакции связи. Людям с брандмауэром это не нравится, им нравится ограничивать порты определенным диапазоном. Вы можете ограничить генерацию динамического порта RPC определенным диапазоном, используя ключи, как описано в разделе Как настроить динамическое выделение порта RPC для работы с межсетевыми экранами .

По моему опыту, если DTCPing может установить соединение DTC, инициированное клиентом и инициированное сервером, ваши транзакции больше не являются проблемой.

19
26.01.2009 08:49:42

Можно также увидеть здесь о том , как включить MSDTC от services.msc контрольной панели.

На сервере, на котором находится триггер, необходимо включить службу MSDTC. Вы можете сделать это, нажав СТАРТ> НАСТРОЙКИ> ПАНЕЛЬ УПРАВЛЕНИЯ> АДМИНИСТРАТИВНЫЕ ИНСТРУМЕНТЫ> УСЛУГИ. Найдите сервис под названием «Координатор распределенных транзакций» и ПРАВЫЙ ЩЕЛЧОК (на нем и выберите)> Старт.

6
31.10.2016 18:55:55

Используйте это для Windows Server 2008 r2 и Windows Server 2012 R2

  1. Нажмите кнопку Пуск , выберите пункт Выполнить , введите dcomcnfg, а затем нажмите кнопку ОК, чтобы открыть службы компонентов .

  2. В дереве консоли щелкните, чтобы развернуть Службы компонентов , щелкните, чтобы развернуть Компьютеры , щелкните, чтобы развернуть Мой компьютер , щелкните, чтобы развернуть Координатор распределенных транзакций, а затем щелкните Локальный код неисправности .

  3. Щелкните правой кнопкой мыши Local DTC и выберите Properties, чтобы открыть диалоговое окно Local DTC Properties .

  4. Перейдите на вкладку « Безопасность ».

  5. Флажок «Сетевой доступ к DTC» .

  6. Наконец отметьте флажки «Разрешить входящий» и «Разрешить исходящий» .

  7. Нажмите Применить , ОК .

  8. Появится сообщение о перезапуске сервиса.

  9. Нажмите ОК и все.

Ссылка: https://msdn.microsoft.com/en-us/library/dd327979.aspx

Примечание. Иногда сетевой брандмауэр на локальном компьютере или сервере может прерывать ваше соединение, поэтому убедитесь, что вы создали правила для «Разрешить входящие» и «Разрешить исходящие» дляC:\Windows\System32\msdtc.exe

126
19.10.2018 08:45:36
Работает и для Windows Server 2012 R2. Спасибо за четкие инструкции. Никогда бы не нашел это сам!
jonazu 13.04.2016 12:14:42
@jonazu теперь я тоже обновил ответ для Windows Server 2012 R2 :)
Shiv Singh 14.04.2016 07:14:00
Хорошая работа, ШивСингх!
Super Coder 22.01.2017 12:21:32
Правильный путь msdtc.exec:\windows\system32\msdtc.exe
firepol 19.10.2018 05:49:48
Кажется, есть ошибка, когда эти свойства не сохраняются при настройке через пользовательский интерфейс, по крайней мере, на кластерных узлах Server 2016. Решение состоит в том, чтобы установить эти свойства вручную в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security. Больше информации о свойствах здесь .
Paul 2.11.2018 16:39:27