2

我正在使用 Entity Framework 5,需要在单个事务中进行多个存储过程调用。它们都是插入,其中每个都依赖于前一个的输出,我希望能够在一个失败的情况下回滚所有内容。每个调用都使用相同的实体对象。第一个调用成功执行,但下一个调用总是失败并出现以下错误:

“底层提供商在 Open 上失败。”

内部异常:“分布式事务管理器 (MSDTC) 的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中为网络访问启用 DTC。”

内部内部异常:“事务管理器已禁用对远程/网络事务的支持。(来自 HRESULT 的异常:0x8004D024)”

有没有办法在不走 DTC 道路的情况下做到这一点?

代码:

ObjectParameter outputParam1 = new ObjectParameter("newEntity1", 0);
ObjectParameter outputParam2 = new ObjectParameter("newEntity2", 0);

using (var scope = new TransactionScope())
{
    try
    {
        using(var context = new DatabaseContext())
        {
            context.f_createEntity1(outputParam1);
        }

        using(var context = new DatabaseContext())
        {
            context.f_createEntity2(ouputParam2, outputParam1.Value);
        }

        ... other calls ...

        scope.Complete();
    }
    catch (Exception ex)
    {
        ... handle error ...
    }
}
4

1 回答 1

1

如果不启用 DTC,就没有办法做到这一点。

来自相关的SO 帖子

事务中至少包含两个支持单阶段通知的持久资源。例如,征用单个连接不会导致事务被提升。但是,每当您打开与数据库的第二个连接导致数据库登记时,System.Transactions 基础结构会检测到它是事务中的第二个持久资源,并将其升级为 MSDTC 事务。

于 2012-08-28T17:36:07.933 回答