如何在C#中使用TransactionScope?

我正在尝试使用TransactionScope ,但继续获得以下exception。
如果重要的话,该应用程序在与数据库不同的机器上运行。 我正在使用SQL Server 2005。

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

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

编辑

我根据反馈做了一些改变。 现在我收到这个错误:

“错误HRESULT E_FAIL已从调用COM组件返回。”
“与基础交易经理的沟通失败了。”

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

以下是客户端上的属性:
客户http://sofzh.miximages.com/c%23/client.jpg

以下是服务器上的属性:
服务器http://sofzh.miximages.com/c%23/server.jpg

您需要按照此Microsoft TechNet文章中的说明启用网络DTC访问。 可能必须在数据库和应用程序服务器上进行此更改。 通常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是最严格的隔离级别,坦率地说,它被选为默认级别。 如果您不需要这种级别的锁定,我强烈建议在实例化TransactionScope时将隔离级别设置为限制较少的选项(ReadCommitted):

 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 } 

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

重新启动计算机。

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

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

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

如果您使用的是SQL Server 2000,则System.Transactions.TransactionScope将导致所有事务都提升为分布式事务,从而需要运行MS Distributed Transaction Coordinator。

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

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

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

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

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

我在这里发了一个问题

但最终我找到了解决方法。 虽然,我不建议为生产代码这样做。 我是在测试环境中做的。