38

我正在尝试使用TransactionScope,但不断收到以下异常。
该应用程序运行在与数据库不同的机器上,如果这很重要的话。我正在使用 SQL Server 2005。

分布式事务管理器 (MSDTC) 的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中启用 DTC 以进行网络访问。

using (TransactionScope tsTransScope = new TransactionScope())
{
    //Do stuff here
    tsTransScope.Complete();
}

编辑

我根据反馈做了一些修改。现在我收到此错误:

“对 COM 组件的调用已返回错误 HRESULT E_FAIL。”
“与底层事务管理器的通信失败。”

解决方案 我认为接受的答案解决了我遇到的最初问题。第二个错误似乎特定于实体框架。我会为此发布另一个问题。

以下是客户端的属性:
客户端 http://www.portnine.com/data/images/Misc/client.jpg

以下是服务器上的属性:
服务器 http://www.portnine.com/data/images/Misc/server.jpg

4

7 回答 7

34

您需要启用网络 DTC 访问,如本Microsoft TechNet 文章中所述。可能必须在数据库和应用程序服务器上都进行此更改。通常 DTC 已经在数据库服务器上打开,所以我会先查看应用程序服务器。

这是我们使用的屏幕截图,除了“允许远程管理”选项: 安全配置截图

我没有遇到您现在遇到的 HRESULT E_Fail 问题,但这篇关于XP SP2 和事务的文章有这个有趣的建议:

您需要注意的另一个配置设置(尽管我认为这是一种不常见的情况)是 RestrictRemoteClients 注册表项。如果此键的值设置为 2 (RPC_RESTRICT_REMOTE_CLIENT_HIGH),则 MSDTC 网络事务将无法正常工作。MSDTC 仅支持 RPC_RESTRICT_REMOTE_CLIENT_NONE (0) 和 RPC_RESTRICT_REMOTE_CLIENT_DEFAULT (1) 值。有关 RestrictRemoteClients 的更多信息,请参阅 http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#XSLTsection128121120120

最后,虽然不是特定于您的问题,但使用该类需要注意的一个非常重要的事情TransactionScope是,它的默认设置是使用Serializable 的事务隔离级别。Serializable 是最严格的隔离级别,坦率地说,它被选为默认级别令人惊讶。如果您不需要这种级别的锁定,我强烈建议您在实例化 a 时将隔离级别设置为限制较少的选项(ReadCommitted)TransactionScope

var scopeOptions = new TransactionOptions();
scopeOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
scopeOptions.Timeout = TimeSpan.MaxValue;

using (var scope = new TransactionScope(TransactionScopeOption.Required,
    scopeOptions))
{
    // your code here
}
于 2009-04-27T17:02:43.230 回答
3

控制面板 - 管理工具 - 组件服务 - 我的电脑属性 - MSDTC 选项卡 - 安全配置选项卡 - 网络 DTC 访问(选中)/允许远程客户端(选中)/允许入站(选中)/允许出站(选中)/启用 TIP 事务(检查)

重新启动计算机。

于 2009-04-27T17:00:25.780 回答
2

根据您使用的后端,TransactionScope 通常需要启用分布式事务管理器。此 MSDN 博客上有一些详细信息。

此外,如果您使用多个资源,则可能需要 DTC。在您的情况下可能需要启用 DTC,或者确保您使用的是 SQL Server 2005 并坚持在轻量级事务中可行的方法。

于 2009-04-27T17:02:02.123 回答
1

您需要使用组件服务管理工具在 MSDTC 的安全配置中启用 DTC 以进行网络访问。

于 2009-04-27T17:02:22.950 回答
0

如果您使用的是 SQL Server 2000,System.Transactions.TransactionScope将导致所有事务被提升为分布式事务,需要运行 MS 分布式事务协调器。

您可以通过启动 MSDTC 服务、升级到 SQL Server 2005 或实施类似于我的 codeproject 解决方案的方法来解决此问题:http: //www.codeproject.com/KB/database/typed_dataset_transaction.aspx

我从来不需要这样做,但您也应该检查 Ocdecio 的回答,以配置 DTC 的网络安全设置。

于 2009-04-27T16:59:28.980 回答
0

您需要为数据库服务器和运行应用程序的服务器启用网络 DTC 访问。

您还需要验证连接不会被防火墙阻止。由于将启动从数据库服务器到应用程序机器的连接,因此将 MSDTC 添加到应用程序机器上的防火墙例外列表中同样重要。

于 2009-04-27T17:09:49.657 回答
0

我在运行集成测试时遇到了同样的问题。

我在这里发布了一个关于这个的问题

但最终我找到了解决方法。虽然,我不建议对生产代码这样做。我是在测试的背景下做的。

于 2009-04-27T17:46:11.910 回答