【问题标题】:TransactionScope, linq and strange transaction manager issue (HRESULT: 0x8004D024)TransactionScope、linq 和奇怪的事务管理器问题 (HRESULT: 0x8004D024)
【发布时间】:2009-04-07 19:00:54
【问题描述】:

我有一个服务级别的方法,它对数据库进行少量更改,我希望它们使用事务控制。此类方法可以执行以下操作: - LINQ SubmitChanges() 功能 - 调用存储过程

组件用户可以将一组这样的基本操作组合成更大的东西。

我看到有一个不错的类 TransactinScope 并尝试使用它:

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 和微软开发服务器使用相同的 (Vista Ultimate) 机器。从单元测试一切正常。 TransactionScope 评论时也是如此。

我正在尝试使用 DTC (http://support.microsoft.com/kb/899191) 的安全性,当我设置接受所有入站和出站事务时,我收到以下错误消息:

对 COM 组件的调用已返回错误 HRESULT E_FAIL。

在调试过程中,我发现在SubmitChanges中,Linq Entity Context有Property Transaction IS NULL(!!),而System.Transactions.Transaction.Current有open transaction

【问题讨论】:

    标签: linq linq-to-sql transactionscope


    【解决方案1】:

    我认为您也可以使用 TransactionScope,只要您将数据上下文传递给您 .Open 的相同连接。

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

    【讨论】:

      【解决方案2】:

      问题发生是因为 Linq Datacontext 是在 transactionscope 之前创建的。

      解决方案是向 LINQ 数据上下文添加自己的事务控制。

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

      以及维护嵌套调用的计数器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 2019-01-29
        • 2013-01-11
        相关资源
        最近更新 更多