Как включить 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 managedIdentifier, Guid & transactionIdentifier, OletxTransactionLevelIsolaction).

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

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

Ответов (7)

Решение

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

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

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

  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

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

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

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

MSDTC можно настроить с помощью модуля MsDtc PowerShell, например:

# Import the module
Import-Module -Name MsDtc

# Set the DTC config
$dtcNetworkSetting = @{
    DtcName                           = 'Local'
    AuthenticationLevel               = 'NoAuth'
    InboundTransactionsEnabled        = $true
    OutboundTransactionsEnabled       = $true
    RemoteClientAccessEnabled         = $true
    RemoteAdministrationAccessEnabled = $true
    XATransactionsEnabled             = $false
    LUTransactionsEnabled             = $true
}
Set-DtcNetworkSetting @dtcNetworkSetting

# Restart the MsDtc service
Get-Service -Name MsDtc | Restart-Service

Запустите на каждой из машин, которые будут поддерживать распределенные транзакции (т. Е. На которых работает служба MSDTC).

@ Дэн,

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

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

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

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

  • Перейдите в Администрирование -> Службы компонентов.
  • Разверните Службы компонентов -> Компьютеры ->
  • Щелкните правой кнопкой мыши -> Свойства -> вкладка MSDTC
  • Нажмите кнопку конфигурации безопасности

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

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

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

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

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