Диспетчер транзакций MSDTC не смог отправить транзакцию в конечный диспетчер транзакций из-за проблем со связью


У меня есть BizTalk server и SQL server, на который BizTalk отправляет сообщения через WCF-SQL. BizTalk server обращается к этому серверу уже более года без каких-либо проблем. Я пришел сегодня утром какой-то вдруг он не может (он работал в пятницу).

Полная ошибка, которую я получаю при вызове конечной точки WCF-SQL:

A message sent to adapter "WCF-SQL" on send port "MyPort" with URI "mssql://mySQLServer" is suspended.
Error details: System.Transactions.TransactionManagerCommunicationException: Communication with the underlying transaction manager has failed. ---> System.Runtime.InteropServices.COMException:
The MSDTC transaction manager was unable to push the transaction to the destination transaction manager due to communication problems.
Possible causes are: a firewall is present and it doesn't have an exception for the MSDTC process, the two machines cannot find each other by their NetBIOS names, or the support for network transactions is not enabled for one of the two transaction managers. (Exception from HRESULT: 0x8004D02A)
at System.Transactions.Oletx.ITransactionShim.Export(UInt32 whereaboutsSize, Byte[] whereabouts, Int32& cookieIndex, UInt32& cookieSize, CoTaskMemHandle& cookieBuffer)
at System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)

Я следовал инструкциям из следующего потока: MSDTC на сервере ' сервер недоступен

Я пробежал msdtc -uninstall затем msdtc -install и несколько раз перезапускал службу.

Я перезагружал сервер несколько раз.

Я могу подключиться к базе данных с помощью SQL Server Management Studio

DTCPing при попытке подключиться с SQL server на Biztalk server приводит к (Когда DTCPing выполняется на BizTalk):

Problem:fail to invoke remote RPC method
Error(0x6BA) at dtcping.cpp @303
-->RPC pinging exception
-->1722(The RPC server is unavailable.)
RPC test failed

При переходе с Biztalk на SQL я получаю это (даже думал, что DTCPing работает на другом конце)

Please refer to following log file for details:
C:TempDTCPingmyserv.log
Invoking RPC method on dbaditest
RPC test is successful
++++++++++++RPC test completed+++++++++++++++
Please start PING from dbaditest to complete the test

Ни один из серверов не использует брандмауэр на все

У меня все кончилось, чтобы попробовать.

Edit: я могу подтвердить, что другие серверы/компьютеры могут подключаться к SQL server. Поэтому я должен предположить, что проблема заключается в BizTalk server.

Edit 2: я попытался подключиться с BizTalk Server на другой SQL-сервер в сети и получил ту же ошибку. Я в нескольких шагах от того, чтобы вскинуть руки и восстановить свою среду разработки-ugg : (

Edit 3: я могу телнетить на порт 135 из BizTalk на SQL Server, так что его ничто не блокирует.

Редактирование 4: результаты DTCTester в:

tablename= #dtc24449
Creating Temp Table for Testing: #dtc24449
Warning: No Columns in Result Set From Executing: 'create table #dtc24449    (ival int)'
Initializing DTC
Beginning DTC Transaction
Enlisting Connection in Transaction
Error:
SQLSTATE=25S12,Native error=-2147168242,msg='[Microsoft][ODBC SQL Server Driver]Distributed transaction error'
Error:
SQLSTATE=24000,Native error=0,msg=[Microsoft][ODBC SQL Server Driver]Invalid cursor state
Typical Errors in DTC Output When
a.  Firewall Has Ports Closed
-OR-
b.  Bad WINS/DNS entries
-OR-
c.  Misconfigured network 
-OR-
d.  Misconfigured SQL Server machine that has multiple netcards.
Aborting DTC Transaction
Releasing DTC Interface Pointers
Successfully Released pTransaction Pointer.
4 2

4 ответа:

Здесь вы уже предприняли некоторые шаги, но внимательно просмотрите статью MSDN по устранению неполадок MSDTC.

Я был бы обеспокоен тем, что кто-то изобразил другой сервер от вашего, но удаление и переустановка MSDTC должны были исправить это. Возможно, стоит проверить и эти значения реестра (по ссылке выше):

Windows повышает безопасность, требуя аутентифицированных вызовов интерфейса RPC. Эта функциональность настраивается с помощью Ключи реестра EnableAuthEpResolution и RestrictRemoteClients. Чтобы убедиться, что удаленные компьютеры могут получить доступ к интерфейсу RPC, выполните следующие действия:

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

Перейдите в раздел HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT

Под ключом RPC создайте следующие записи DWORD с указанными значениями. Если ключ RPC не существует, то он должен быть созданный.

DWORD entry             Default value  Recommended value
EnableAuthEpResolution  0 (disabled)   1
RestrictRemoteClients   1 (enabled)    0

Закройте Редактор Реестра.

Перезагрузите службу MSDTC.

  1. Является ли ваше имя компьютера BizTalk / SQL уникальным? (нет конфликтов с другими машинами)

  2. Можно ли DTC подключиться к другому SQL-серверу с Вашего BizTalk-сервера? Я бы предложил вам использовать DTCTester тестирование соединения DTC вместо DTCPing.

Не уверен, что это поможет, но подумал, что я упомяну об этом.

С обоих серверов:

Старт -> Инструменты Администратора -> Компонентные Сервисы

Развернуть службы компонентов -> компьютеры -> Мой компьютер -> координатор распределенных транзакций и щелкните правой кнопкой мыши локальный DTC . Перейдите на вкладкуSecurity и проверьте настройки там.

  • включить сетевой DTC-доступ
  • Разрешить Удаленное Клиенты
  • разрешить входящий / исходящий по мере необходимости
  • Выберите правильную аутентификацию
  • включить XA транзакции по мере необходимости

Служба MSDTC должна автоматически перезапускаться. Эти настройки, возможно, изменились с пятницы? У меня это уже случалось раньше по неизвестным причинам

Вау, я наконец-то понял это. Как большинство людей сказали, это должно быть какой-то сетевой вопрос (и я не возражал). Кикер состоял в том, что мой компьютер был разрешен DTC от it до SQL, но виртуальная машина, работающая на моем компьютере, этого не сделала. в итоге мы были вынуждены установить Symantec Endpoint Protection только на прошлой неделе (прямо перед тем, как я уехал на выходные).

Я удалил его и все это работает сейчас.