代码之家  ›  专栏  ›  技术社区  ›  st78

TransactionScope、Linq和奇怪的事务管理器问题(hresult:0x8004d024)

  •  2
  • st78  · 技术社区  · 16 年前

    我有一个服务级别的方法,它对数据库进行很少的更改,我希望它们使用事务控制。这种方法可以做到以下几点: -linq submitchanges()功能 -调用StoredProcedures

    组件用户可以将这些基本操作组合成更大的操作。

    我看到有一个很好的类TransactionScope并尝试使用它:

    using (TransactionScope transaction = new TransactionScope())
    {
         content = repository.CreateBaseContent(content);
         result = repository.CreateTreeRelation(content, parent.Id, name);
         transaction.Complete();
    }
    
    public baseContent CreateBaseContent(baseContent content)
    {
           EntityContext.baseContents.InsertOnSubmit(content);
           EntityContext.SubmitChanges();
    
           return content;
    }
    
    public CreateTreeRelation (params)
    {
    // do StoredProcedure call here via LINQ
    }
    

    我的假设是,在外层可以添加另一个级别的事务范围。相反,我有以下错误:

    事务管理器已禁用对远程/网络事务的支持。(来自hresult的异常:0x8004d024)

    我正在为MS SQL 2005和Microsoft Development Server使用相同的(Vista Ultimate)计算机。通过单元测试,一切正常。TransactionScope注释时相同。

    我想和安全部门一起玩( http://support.microsoft.com/kb/899191 )当我设置为接收所有入站和出站事务时,会出现以下错误消息:

    错误hresult e_fail已从对COM组件的调用中返回。

    在调试期间,我发现在SubmitChanges中,Linq实体上下文的属性事务为空(!!)和system.transactions.transaction.current具有未结事务

    2 回复  |  直到 16 年前
        1
  •  3
  •   eglasius    16 年前

    我想你也可以使用TransactionScope,只要你将数据内容传递给和你相同的连接。

    TransactionScope的另一个问题是,它不关心连接字符串是否相同,只需再执行一次。Open会将事务提升为分布式事务。然后您必须处理相关的配置,以及它没有使用轻量级事务这一事实,这正是这种情况所需要的。

        2
  •  2
  •   st78    16 年前

    发生问题的原因是Linq DataContext是在TransactionScope之前创建的。

    解决方案是向LinqDataContext添加自己的事务控制。

    Connection.Open()
    Transaction = Connection.BeginTransaction();
    

    和计数器来维护嵌套调用。