如何在C#中使用TransactionScope?

我正在尝试使用TransactionScope,但不断得到下面的exception。 该应用程序运行在不同于数据库的机器上,如果这很重要的话。 我正在使用Sql Server 2005。

“分布式事务pipe理器(MSDTC)的networking访问已被禁用,请使用组件服务pipe理工具在MSDTC的安全configuration中启用DTC进行networking访问。

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

编辑

我根据反馈做出了一些反应。 现在我得到这个错误:

 {"Error HRESULT E_FAIL has been returned from a call to a COM component."} {"Communication with the underlying transaction manager has failed."} 

解决scheme我认为接受的答案确定了我所得到的最初的问题。 第二个错误似乎是特定于entity framework。 我会张贴另一个问题。

以下是客户端的属性: 客户端http://www.portnine.com/datahttp://img.dovov.comMisc/client.jpg

以下是服务器上的属性:

服务器http://www.portnine.com/datahttp://img.dovov.comMisc/server.jpg

您需要按照此Microsoft TechNet文章所述启用networkingDTC访问。 可能必须在数据库和应用程序服务器上进行此更改。 通常情况下,DTC已经打开数据库服务器,所以我会先看看应用服务器。

以下是我们使用的除“允许远程pipe理”选项外的屏幕截图: 安全配置截图

我没有遇到你现在正在使用的HRESULT E_Fail问题,但是这篇关于XP SP2和交易的文章有这个有趣的build议:

另一个需要注意的configuration设置(尽pipe我认为这是一种不常见的情况)是RestrictRemoteClientsregistry项。 如果此项的值设置为2(RPC_RESTRICT_REMOTE_CLIENT_HIGH),则MSDTCnetworking事务将无法正常工作。 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类的一个非常重要的事情是,它的默认设置是利用可序列化的事务隔离级别 。 可串行化是最严格的隔离级别,坦率地说,它被选作默认的令人惊讶。 如果你不需要这个级别的locking,我强烈build议在实例化一个TransactionScope时将隔离级别设置为一个限制较less的选项(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 } 

控制面板 – pipe理工具 – 组件服务 – 我的电脑属性 – MSDTC选项卡 – 安全configuration选项卡 – networkingDTC访问(选中)/允许远程客户端(选中)/允许input(选中)/允许输出(选中)/启用TIP交易选中)

重新启动计算机。

根据您使用的后端,TransactionScope通常要求启用分布式事务pipe理器。 一些细节在这个MSDN博客上 。

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

您需要使用组件服务pipe理工具在MSDTC的安全configuration中启用DTC以进行networking访问。

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

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

我从来不需要这样做,但是您也应该检查Ocdecio的configurationDTCnetworking安全设置的答案。

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

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

我有同样的问题运行集成testing。

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

但最终我find了一个方法。 虽然,我不会推荐做生产代码。 我正在testing的范围内。