MSDTC问题与ADO.NET实体框架中的事务

Ale*_*der 6 .net msdtc transactions ado.net-entity-data-model

在我们当前的项目中,我们使用ADO.NET Entity Framework作为应用程序的数据层.有些任务需要在事务中运行,因为在数据库中有很多工作要做.我正在使用TransactionScope来包围这些任务.

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    // Do something...
    transactionScope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

问题是我在使用TransactionScope时发生异常:

System.Data.EntityException:基础提供程序在Open上失败.---> System.Transactions.TransactionManagerCommunicationException:与底层事务管理器的通信失败.---> System.Runtime.InteropServices.COMException(0x80004005):错误HRESULT E_FAIL已从调用COM组件返回.

似乎此错误必须与MSDTC(Microsoft分布式事务处理协调器)执行某些操作.当我更改MSDTC的安全配置时,会抛出另一个异常:

System.Data.EntityException:基础提供程序在Open上失败.---> System.Transactions.TransactionManagerCommunicationException:已禁用分布式事务管理器(MSDTC)的网络访问.请使用组件服务管理工具在MSDTC的安全配置中启用DTC以进行网络访问.

但是,MSDTC已配置,TransactionScope将导致错误.有人知道这里出了什么问题吗?

Nik*_*y R 7

默认情况下,MSDTC禁用网络访问.为了让它工作,你应该去

控制面板 - >管理工具 - >组件服务 - >组件服务 - >计算 - >我的电脑 - >右键单击 - >属性 - > MSDTC->安全配置

并选中以下复选框Network DTC Access,Allow Inbound,Allow Outbound.应根据您的环境选择认证.您可能还想查看DTCPing工具来调试分布式事务.为了给你一个捷径 - 你可能需要修改你的注册表:

HKLM\Software\Policies\Microsoft\Windows NT\RPCRestrictRemoteClients = 0 HKLM\Software\Policies\Microsoft\Windows NT\RPCEnableAuthEpResolution = 1

让一切运转起来.


Ale*_*der -3

嗯,当我将TransactionScopeOption更改为“抑制”时,它似乎有效:

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Suppress))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

大家知道为什么吗?

  • 我认为在这种情况下它根本不使用事务,但我不确定。 (4认同)