114

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

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

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

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

4

7 回答 7

138

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

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

  2. 在控制台树中,单击展开Component Services,单击展开Computers,单击展开My Computer,单击展开Distributed Transaction Coordinator,然后单击Local DTC

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

  4. 单击安全选项卡。

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

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

  7. 单击应用确定

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

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

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

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

于 2014-12-03T04:54:01.903 回答
104

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

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

  • 转到管理工具 -> 组件服务
  • 展开组件服务 -> 计算机 ->
  • 右键单击 -> 属性 -> MSDTC 选项卡
  • 点击安全配置按钮
于 2008-08-11T12:10:05.363 回答
21

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

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

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

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

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

于 2009-01-26T08:49:42.470 回答
7

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

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

于 2014-06-03T07:35:51.723 回答
4

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

于 2008-08-11T12:04:11.523 回答
4

@担,

我不需要为事务启用 msdtc 吗?

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

于 2008-08-11T23:02:13.597 回答
1

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 服务的地方)的每台机器上运行。

于 2021-05-07T04:01:29.170 回答