由于通信问题,MSDTC 事务管理器无法将事务推送到目标事务管理器

The MSDTC transaction manager was unable to push the transaction to the destination transaction manager due to communication problems

我有一个 BizTalk 服务器和一个 SQL 服务器,BizTalk 通过 WCF-SQL 向其发送消息。 BizTalk 服务器已调用该服务器一年多了,没有出现任何问题。我今天早上突然来不了了(周五上班)。

我在调用 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 -uninstall 然后 msdtc -install 并重新启动服务几次。

我重启服务器好几次了。

我可以使用 Sql Server Management Studio

连接到数据库

尝试从 SQL 服务器连接到 Biztalk 服务器时的 DTCPing 结果(当 DTCPing 在 BizTalk 上 运行ning 时):

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 在另一端是 运行ning)

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

服务器都运行没有防火墙

我没有办法尝试了。

编辑: 我可以确认其他 servers/computers 可以连接到 SQL 服务器。所以我不得不假设问题出在 BizTalk 服务器上。

编辑 2: 我尝试从 BizTalk Server 连接到网络上的另一个 SQL 服务器,但遇到了同样的错误。我马上就要举手重建我的开发环境了——ugg :(

编辑 3: 我可以通过 telnet 端口 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.

不确定这是否有帮助,但我想我会提一下。

来自两个服务器:

开始 -> 管理工具 -> 组件服务

展开组件服务 -> 计算机 -> 我的电脑 -> Distributed Transaction Coordinator 并右键单击 Local DTC。转到 安全 选项卡并检查那里的设置。

  • 启用网络 DTC 访问
  • 允许远程客户端
  • 根据需要允许Inbound/Outbound
  • Select 正确验证
  • 根据需要启用 XA 事务

MSDTC 服务应该自动重启。这些设置可能自周五以来已经改变?我以前遇到过这种情况,原因不明

  1. 您的 BizTalk/SQL 计算机名称是否唯一? (不与其他机器冲突)

  2. 您能否通过 DTC 从 BizTalk 服务器连接到另一台 SQL 服务器?我建议你使用 DTCTester 测试 DTC 连接而不是 DTCPing。

您已经在此处执行了一些步骤,但请仔细阅读 MSDN Article on Troubleshooting MSDTC

我担心有人从您的服务器镜像了另一台服务器,但卸载并重新安装 MSDTC 应该可以解决这个问题。也可能值得检查这些注册表值(来自上面 link):

Windows enhances security by requiring authenticated calls to the RPC interface. This functionality is configurable through the EnableAuthEpResolution and RestrictRemoteClients registry keys. To ensure that remote computers are able to access the RPC interface, follow these steps:

Click Start, click Run, type regedit.exe, and then click OK to start Registry Editor.

Navigate to HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT

Under the RPC key, create the following DWORD entries with the indicated values. If the RPC key does not exist then it must be created.

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

Close Registry Editor.

Restart the MSDTC Service.

哇,我终于想通了。正如大多数人所说,这一定是某种网络问题(我并不反对)。更糟糕的是我的 PC 被允许从它到 SQL 的 DTC,但我 PC 上的 VM 运行 没有。最终的结果是,就在上周(就在我周末离开之前),我们被迫安装了 Symantec Endpoint Protection。

我卸载了它,现在一切正常。