如何使用多个嵌套的事务处理器?

如何使用多个嵌套的事务处理器?

问题描述:

我在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.] 

如果我使用MultipleActiveResultSets为SQL Server,我反而得到的异常

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

没有人有从LINQ2SQL和transactionscopes这样的工作经验?

我知道,我们已经经历了该项目I'm这个问题目前正在研究,我知道有一些东西需要与一个存储过程工作时LinqToSql产生的dbml文件的错误的方式。我们必须手动完成工作。 LinqToSql显然从sproc返回了ISingeResult,并生成了错误。

我wasn't谁纠正错误的人,但我知道它有什么与此有关。

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

这对我来说是“面子掌”的时刻,但考虑到我是看到这个确切的行为,并没有马上打我,我想我会继续前进,发布这种可能性:

我看到这种行为,当我有READUNCOMMITTED一个TransactionScope集:

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

和我的LINQ到SQL中调用存储过程返回PROC的结果。面向掌中的是,在proc本身中,可以指定WITH(NOLOCK)SQL提示,因此不需要将Linq to SQL查询包装在ReadUncommitted事务范围中。 (至少在我的情况)

我猜,你想读一些数据,并修改它的飞行(而读仍在进行中)。
在这种情况下,最简单的办法是首先读所有的数据(例如,使用的IEnumerable <> .ToList()扩展方法),然后执行所有对数据的操作。

+0

这结束了我的问题上面类似的问题,所以从我的+1 :) – James 2011-01-19 19:41:48

我知道这是一个古老的线程,但它是*命中谷歌在这个错误,所以我认为这将是值得加入我的答案。在我的情况下,我使用实体框架,所以甚至不确定它适用,但即使如此,一些使用EF的人可能会来到这里。在我的情况下,这是因为我正在调用一个存储过程,并且没有对返回的行进行任何操作。因为EF没有读取行,所以这是“打开操作”。我的解决办法是简单地一()添加到每个过程调用的末尾:

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