【问题标题】:How to use multiple, nested, transactionscopes?如何使用多个嵌套的事务范围?
【发布时间】:2009-06-09 16:15:22
【问题描述】:

我在 linq2sql 中做一些需要在事务中运行的操作。但是,我在事务内部使用的一些方法也使用 linq2sql 并在它们自己的事务内部运行(内部事务在存储过程中运行)。这给了我一个例外

[TransactionInDoubtException: The transaction is in doubt.]
   System.Transactions.TransactionStateInDoubt.EndCommit(InternalTransaction tx) +76
with the inner exception
[SqlException (0x80131904): There is already an open DataReader associated with this Command which must be closed first.]

如果我对 SQL Server 使用 MultipleActiveResultSets,我会得到异常

[SqlException (0x80131904): The transaction operation cannot be performed because there are pending requests working on this transaction.]

有没有人以这种方式使用 linq2sql 和 transactionscope 的经验?

【问题讨论】:

    标签: c# linq-to-sql transactions


    【解决方案1】:

    这对我来说是一个“面对面”的时刻,但考虑到我看到了这种确切的行为,而且它并没有立即影响到我,我想我会继续发布这个可能性:

    当我为 ReadUncommitted 设置 TransactionScope 时,我看到了这种行为:

    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, 
           new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })
    

    我的 Linq to SQL 正在调用一个存储过程来返回该过程的结果。值得一提的是,在 proc 本身内可以指定 WITH (NOLOCK) SQL 提示,因此无需将 Linq to SQL 查询包装在 ReadUncommitted 事务范围内。 (至少在我的情况下)

    【讨论】:

      【解决方案2】:

      我猜,您正在尝试读取一些数据并即时修改(读取仍在进行中)。
      在这种情况下,最简单的选择是先读取所有数据(例如,使用 IEnumerable.ToList() 扩展方法),然后对数据执行所有操作。

      【讨论】:

      • 这最终成为我遇到上述类似问题的问题,所以我 +1 :)
      【解决方案3】:

      我知道我们在我目前正在处理的项目中遇到了这个问题,我知道这与 LinqToSql 在使用存储过程时以错误的方式生成 dbml 文件有关。我们必须手动完成它才能使其正常工作。 LinqToSql 显然从存储过程中返回了 ISingeResult 并产生了错误。

      我不是纠正错误的人,但我知道这与此有关。

      更多信息:http://www.west-wind.com/weblog/posts/246222.aspx

      【讨论】:

        【解决方案4】:

        我知道这是一个旧线程,但它是谷歌在这个错误上的最高级别,所以我认为添加我的答案是值得的。就我而言,我使用的是实体框架,所以甚至不确定它是否适用,但即便如此,一些使用 EF 的人可能会来到这里。就我而言,这是因为我正在调用一个存储过程并且没有对返回的行做任何事情。因为 EF 没有读回这些行,所以这是“打开操作”。我的解决方案是简单地将 First() 添加到每个过程调用的末尾:

        myentities.CallMyStoredProc(A, B, C).First();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多