如何在SQL Server上启用MSDTC?

时间:2008-08-11 11:57:17

标签: sql-server msdtc

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

  

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

我在安装了应用的PC上关注了the Kbalertz guide to enable MSDTC,但仍然出现错误。

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

7 个答案:

答案 0 :(得分:111)

将此用于Windows Server 2008 r2和Windows Server 2012 R2

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

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

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

  4. 点击安全标签。

  5. 勾选“网络DTC访问权限”复选框。

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

  7. 点击应用确定

  8. 会弹出一条关于重新启动服务的消息。

  9. 点击确定即可。

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

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

    的出站“连接

答案 1 :(得分:101)

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

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

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

答案 2 :(得分:17)

我发现最好的调试方法是使用名为DTCPing的微软工具

  1. 将文件复制到服务器(DB)和客户端(应用程序服务器/客户端PC)
    • 在服务器和客户端启动它
    • 在服务器上:填写客户端netbios计算机名称并尝试设置DTC连接
    • 重启两个应用程序。
    • 在客户端:填写服务器netbios计算机名称并尝试设置DTC连接
  2. 我在旧公司网络上遇到过各种问题,我有一些提示:

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

    根据我的经验,如果DTCPing能够设置从客户端发起并从服务器启动的DTC连接,那么您的交易不再是问题。

答案 3 :(得分:6)

还可以看到here如何从控制面板的services.msc打开MSDTC。

  

在触发器所在的服务器上,您需要转动MSDTC   服务。您可以点击START>设置>控制面板>行政工具>服务。找到名为“分布式事务处理协调器”的服务和右键单击(在其上和   选择)>启动。

答案 4 :(得分:4)

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

答案 5 :(得分:4)

@丹,

  

我是否需要启用msdtc   交易工作?

仅限分布式事务 - 涉及多个连接的事务。请务必确保您只在交易中打开一个连接,并且不会升级 - 性能也会好得多。

答案 6 :(得分:0)

MSDTC 可以使用 MsDtc PowerShell 模块进行配置,例如:

# Import the module
Import-Module -Name MsDtc

# Set the DTC config
$dtcNetworkSetting = @{
    DtcName                           = 'Local'
    AuthenticationLevel               = 'NoAuth'
    InboundTransactionsEnabled        = $true
    OutboundTransactionsEnabled       = $true
    RemoteClientAccessEnabled         = $true
    RemoteAdministrationAccessEnabled = $true
    XATransactionsEnabled             = $false
    LUTransactionsEnabled             = $true
}
Set-DtcNetworkSetting @dtcNetworkSetting

# Restart the MsDtc service
Get-Service -Name MsDtc | Restart-Service

在将支持分布式事务的每台机器上运行(即运行 MSDTC 服务的机器)。