如何在SQL Server上启用MSDTC?

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

System.Transactions.TransactionManagerCommunicationException:分布式事务pipe理器(MSDTC)的networking访问已被禁用。 请使用组件服务pipe理工具—> System.Runtime.InteropServices.COMException(0x8004D024)在MSDTC的安全configuration中启用DTC以进行networking访问:事务pipe理器已禁用其对远程/networking事务的支持。 (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吗? 您遇到的升级通常是由于在一个TransactionScope中创build多个连接而导致的。

如果您确实需要它,则需要按照错误消息中所述启用它。 在XP上:

  • 转到pipe理工具 – >组件服务
  • 展开组件服务 – >计算机 – >
  • 右键单击 – >属性 – > MSDTC选项卡
  • 点击安全configurationbutton

将其用于Windows Server 2008 R2和Windows Server 2012 R2

  1. 单击开始 ,单击运行 ,键入dcomcnfg ,然后单击确定以打开组件服务

  2. 在控制台树中,单击以展开组件服务 ,单击以展开计算机 ,单击以展开我的电脑 ,单击以展开分布式事务处理协调器 ,然后单击本地DTC

  3. 右键单击“ 本地DTC” ,然后单击“ 属性”以显示“ 本地DTC属性”对话框。

  4. 单击安全选项卡。

  5. 选中“networkingDTC访问”checkbox。

  6. 最后选中“允许入站”“允许出站”checkbox。

  7. 点击应用确定

  8. popup关于重新启动服务的消息。

  9. 点击确定 ,这就是全部。

参考: https : //msdn.microsoft.com/en-us/library/dd327979.aspx

注意:有时,本地计算机或服务器上的networking防火墙可能会中断连接,因此请确保为c:\windows\msdtc.exe创build了“允许入站”“允许出站”连接的规则

我发现最好的debugging方法是使用称为DTCPing的微软工具

  1. 将文件复制到服务器(DB)和客户端(应用程序服务器/客户端PC)
    • 在服务器和客户端启动它
    • 在服务器上:填写客户端netbios计算机名称并尝试设置DTC连接
    • 重启两个应用程序。
    • 在客户端:填写服务器netbios计算机名称并尝试设置DTC连接

我在旧公司networking中遇到了一些问题,我有一些提示:

  • 如果您收到错误消息“Gethostbyname失败”,则表示计算机无法通过其netbios名称find另一台计算机。 例如,服务器可以parsing和ping客户端,但在DNS级别上工作。 不在netbios查找级别。 使用WINS服务器或更改LMHOST(脏)将解决此问题。
  • 如果出现“拒绝访问”错误,则安全设置不匹配。 您应该比较msdtc的安全选项卡并获取匹配的服务器和客户端。 另一个要看的是RestrictRemoteClients值。 根据您的操作系统版本,更重要的是这个服务包,这个值可以是不同的。
  • 其他连接问题:
    • 服务器和客户端之间的防火墙必须允许通过端口135进行通信。更重要的是,连接可以从两个站点发起(我的公司的防火墙人员有很多问题,因为他们假设只有服务器会打开一个连接在那个港口)
    • 该协议返回一个随机端口连接到真正的事务通信。 防火墙的人不喜欢这样,他们喜欢把端口限制在一定范围内。 您可以使用密钥将RPCdynamic端口生成限制在一定范围内,如“ 如何configurationRPCdynamic端口分配以使用防火墙”中所述 。

根据我的经验,如果DTCPing能够build立从客户端发起并从服务器发起的DTC连接,那么交易就不再是问题了。

@担,

我是否需要启用msdtc才能使事务正常工作?

只有分布式事务 – 涉及多个连接的事务。 确保你只是在事务中打开一个连接,而不会升级 – 性能也会好很多。

在这里也可以看到如何从控制面板的services.msc打开MSDTC。

在触发器所在的服务器上,您需要打开MSDTC服务。 您可以点击开始>设置>控制面板>pipe理工具>服务。 查找名为“分布式事务处理协调器”和右键单击(在其上并select)>开始的服务。

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