如何在SQL Server上启用MSDTC?


106

这甚至是一个有效的问题吗?我有一个使用MSTDC的.NET Windows应用程序,并且抛出异常:

System.Transactions.TransactionManagerCommunicationException:分布式事务管理器(MSDTC)的网络访问已被禁用。请使用组件服务管理工具---> System.Runtime.InteropServices.COMException(0x8004D024),在MSDTC的安全配置中为网络访问启用DTC:事务管理器已禁用对远程/网络事务的支持。(来自HRESULT的异常:0x8004D024)位于System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize,Byte [] propgationToken,IntPtrmanagedIdentifier,Guid&transactionIdentifier,OletxTransactionIsolationLevel&isolationLevel,ITransactionShim&transactionShim)。

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

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


如果上述解决方案不能解决问题,请查看此链接
Shahab J

Answers:


127

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

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

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

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

  4. 单击安全选项卡。

  5. 选中“网络DTC访问”复选框。

  6. 最后,选中“允许入站”“允许出站”复选框。

  7. 单击“ 应用”,然后单击“确定”

  8. 将弹出有关重新启动服务的消息。

  9. 单击确定,仅此而已。

参考:https : //msdn.microsoft.com/zh-cn/library/dd327979.aspx

注意:有时“本地计算机”或“服务器”上的网络防火墙可能会中断您的连接,因此请确保为以下情况创建 “允许入站”“允许出站”连接的规则C:\Windows\System32\msdtc.exe


同样适用于Windows Server 2012 R2。感谢您的明确指示。永远不会一个人找到这个!
jonazu

@jonazu现在我也更新了Windows Server 2012 R2的答案:)
Shiv Singh

ShivSingh干得好!
超级编码器

正确的路径msdtc.exe是:c:\windows\system32\msdtc.exe
firepol

1
似乎存在一个错误,即通过UI设置时至少在群集Server 2016节点上这些属性不会停留。解决方案是在注册表中手动设置这些属性:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security。有关属性的更多信息,请参见此处
保罗

102

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

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

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

2
同样在Windows防火墙中,我打开了端口135 TCP,并添加了c:\ windows \ msdtc.exe作为例外
Sameer Alibhai 2010年

20
感谢您对由于在单个TransactionScope中创建多个连接而引起的错误的评论。我遇到了错误,而这正是问题所在。我不想使用MSDTC,所以我发现了错误的新连接并重用了现有的连接。谢谢!
吉姆·麦基思

10
我在Windows 7和Windows 8上,只有一个“默认协调器”部分。在哪里可以找到您正在谈论的安全配置?
qdev76 2014年

2
1)右键单击本地DTC,然后选择属性2)打开安全性选项卡3)至少检查网络DTC访问,允许远程客户端和允许入站。
Rob Sedgwick

19

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

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

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

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

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


6

也可以在此处查看如何从控制面板的services.msc中打开MSDTC。

在触发器所在的服务器上,您需要打开MSDTC服务。您可以通过单击开始>设置>控制面板>管理工具>服务来实现。找到名为“分布式事务处理协调器”的服务,然后单击“右键单击”(在其上选择)>“启动”。



4

@担,

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

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


我不需要启用msdtc才能使事务正常工作吗?无论哪种方式,据我所知,并没有建立多个连接。我已经在客户端PC上运行了这些步骤,您是说我也应该在数据库服务器上执行这些步骤吗?

@Dan,如果您使用ado.net事务,则无需启用DTC。仅在使用分布式事务时,才需要在服务器上启用MSDTC
Niraj 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.