在我们当前的项目中,我们使用ADO.NET Entity Framework作为应用程序的数据层.有些任务需要在事务中运行,因为在数据库中有很多工作要做.我正在使用TransactionScope来包围这些任务.
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew)) { // Do something... transactionScope.Complete(); }
问题是我在使用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将导致错误.有人知道这里出了什么问题吗?
默认情况下,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
让一切运转起来.