如何在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
-
单击开始 ,单击运行 ,键入dcomcnfg ,然后单击确定以打开组件服务 。
-
在控制台树中,单击以展开组件服务 ,单击以展开计算机 ,单击以展开我的电脑 ,单击以展开分布式事务处理协调器 ,然后单击本地DTC 。
-
右键单击“ 本地DTC” ,然后单击“ 属性”以显示“ 本地DTC属性”对话框。
-
单击安全选项卡。
-
选中“networkingDTC访问”checkbox。
-
最后选中“允许入站”和“允许出站”checkbox。
-
点击应用 , 确定 。
-
popup关于重新启动服务的消息。
-
点击确定 ,这就是全部。
参考: https : //msdn.microsoft.com/en-us/library/dd327979.aspx
注意:有时,本地计算机或服务器上的networking防火墙可能会中断连接,因此请确保为c:\windows\msdtc.exe
创build了“允许入站”和“允许出站”连接的规则
我发现最好的debugging方法是使用称为DTCPing的微软工具
- 将文件复制到服务器(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是一个不错的应用程序,可以帮助您解决任何其他问题。