如何在SQL Server上启用MSDTC?

时间:2020-03-05 18:38:56  来源:igfitidea点击:

这甚至是一个有效的问题吗?我有一个使用MSTDC的.NET Windows应用程序,它引发了异常:

System.Transactions.TransactionManagerCommunicationException: Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for
  network access in the security configuration for MSDTC using the Component Services Administrative tool ---> System.Runtime.InteropServices.COMException (0x8004D024): The transaction manager has disabled its support for remote/network
  transactions. (Exception from HRESULT: 0x8004D024) at System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32
  propgationTokenSize, Byte[] propgationToken, IntPtr managedIdentifier,
  Guid& transactionIdentifier, OletxTransactionIsolationLevel&
  isolationLevel, ITransactionShim& transactionShim)....

我按照Kbalertz指南在安装了该应用程序的PC上启用MSDTC,但仍然会发生错误。

我想知道这是否是数据库问题?如果是这样,我该如何解决?

解决方案

回答

必须在服务器和客户端上的两个系统上都启用MSDTC。
另外,请确保阻止RPC的系统之间没有防火墙。
DTCTest是一个不错的应用程序,可以解决任何其他问题。

回答

我们甚至需要MSDTC吗?我们遇到的升级通常是由在单个TransactionScope中创建多个连接引起的。

如果确实需要它,则需要按照错误消息中的说明启用它。在XP上:

  • 转到管理工具->组件服务
  • 展开组件服务->计算机->
  • 右键单击->属性-> MSDTC选项卡
  • 点击安全配置按钮

回答

@担,

Do I not need msdtc enabled for
  transactions to work?

仅分布式事务涉及多个连接的事务。双重确保我们仅在事务内打开单个连接,并且不会升级性能也会更好。

回答

我发现最好的调试方法是使用称为DTCPing的Microsoft工具

  • 在服务器上:填写客户端netbios计算机名称,然后尝试建立DTC连接
  • 重新启动两个应用程序。
  • 在客户端:填写服务器netbios计算机名称,然后尝试建立DTC连接

我在旧公司网络中遇到了票价问题,并且得到了一些提示:

  • 如果收到错误消息" Gethostbyname失败",则表示该计算机无法通过其netbios名称找到另一台计算机。例如,服务器可以解析和ping客户端,但是可以在DNS级别上工作。不在netbios查找级别。使用WINS服务器或者更改LMHOST(脏)将解决此问题。
  • 如果收到错误"拒绝访问",则安全设置不匹配。我们应该比较msdtc的安全性选项卡,并使服务器和客户端匹配。要查看的另一件事是RestrictRemoteClients值。根据操作系统版本,更重要的是Service Pack,此值可能会有所不同。
  • 该协议返回一个随机端口以连接到实际事务通信。防火墙人员不喜欢这样,他们喜欢将端口限制在一定范围内。我们可以使用如如何配置RPC动态端口分配以与防火墙一起使用中所述的键将RPC动态端口生成限制在一定范围内。

以我的经验,如果DTCPing能够建立从客户端启动和从服务器启动的DTC连接,则事务不再是问题。