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

106

Это вообще актуальный вопрос? У меня есть приложение .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 managedIdentifier, Guid & transactionIdentifier, OletxTransactionLevelIsolaction).

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

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

Дэн
источник
Если упомянутые решения не решают проблему, проверьте эту ссылку
Shahab J

Ответы:

127

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

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

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

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

  4. Щелкните вкладку Безопасность .

  5. Установите флажок «Доступ к сети DTC» .

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

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

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

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

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

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

Шив Сингх
источник
Также работает с Windows Server 2012 R2. Спасибо за четкие инструкции. Я бы никогда не нашел это самостоятельно!
jonazu
@jonazu, теперь у меня есть обновленный ответ и для Windows Server 2012 R2 :)
Шив Сингх,
Хорошая работа, ШивСингх!
Super Coder
Правильный путь msdtc.exe:c:\windows\system32\msdtc.exe
firepol
1
Кажется, есть ошибка, из-за которой эти свойства не сохраняются при установке через пользовательский интерфейс, по крайней мере, на кластерных узлах Server 2016. Решение состоит в том, чтобы установить эти свойства вручную в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security. Больше информации о свойствах здесь .
Пол
102

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

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

  • Перейдите в Администрирование -> Службы компонентов.
  • Разверните Службы компонентов -> Компьютеры ->
  • Щелкните правой кнопкой мыши -> Свойства -> вкладка MSDTC
  • Нажмите кнопку конфигурации безопасности
Эндрю Питерс
источник
2
Также в брандмауэре Windows я открыл порт 135 TCP и добавил c: \ windows \ msdtc.exe в качестве исключения
Самир Алибхай
20
Благодарим за комментарий об ошибке, вызванной созданием нескольких соединений в пределах одного TransactionScope. Я получал сообщение об ошибке, и это была проблема. Я не хотел использовать MSDTC, поэтому обнаружил ошибочное новое соединение и повторно использовал существующее. Спасибо!
Джим МакКит,
10
У меня Windows 7 и 8, и там только раздел «Координатор по умолчанию». Где я могу найти конфигурацию безопасности, о которой вы говорите?
qdev76 06
2
1) Щелкните правой кнопкой мыши Local DTC и выберите свойства 2) Откройте вкладку безопасности 3) Отметьте хотя бы Network DTC Access, Allow Remote Clients и Allow Inbound.
Роб Седжвик,
19

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

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

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

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

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

Дэви Лэндман
источник
6

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

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

Кэмерон Кастильо
источник
4

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

Ларс Мухлум
источник
Я думаю, это новое место microsoft.com/en-us/download/details.aspx?id=30746
Air2
4

@ Дэн,

Мне не нужен msdtc для работы транзакций?

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

Эндрю Питерс
источник
Мне не нужен msdtc для работы транзакций? В любом случае, насколько мне известно, несколько подключений не выполняются. Я уже выполнил эти шаги на клиентском ПК, вы говорите, что я должен также сделать эти шаги на сервере базы данных?
Дэн
@Dan, вам не нужно включать DTC, если вы используете транзакции ado.net. Вам необходимо включить MSDTC на сервере, только если вы используете распределенные транзакции
Нирадж