2009-06-09 12 views
4

私はトランザクションで実行する必要があるlinq2sqlでいくつかの操作をしています。しかし、トランザクションの内部で使用するメソッドの中には、linq2sqlを使用して独自のトランザクション内で実行するものもあります(内部トランザクションはストアドプロシージャ内で実行されます)。これは、私が代わりに例外を取得、私はSQL ServerのMultipleActiveResultSetsを使用する場合は例外複数のネストされたトランザクションスコープの使用方法は?

[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.] 

を与える

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

は、誰もがこのようにlinq2sqlとtransactionscopesでの作業の経験を持っていますか?

答えて

0

私が現在取り組んでいるプロジェクトでこの問題が発生していることは知っていますが、sprocで作業するときにdbmlファイルを生成するLinqToSqlと何か関係があります。それを動作させるには手動で行う必要がありました。 LinqToSqlは明らかにsprocからISingeResultを返し、エラーを生成しました。

私はエラーを修正した人物ではありませんでしたが、これには関係があります。

さらに詳しい情報:http://www.west-wind.com/weblog/posts/246222.aspx

2

これは私のために、「顔の手のひら」瞬間だったが、私はこの正確な振る舞いを見ていた考えると、それはすぐに私にヒットしませんでした、私は私が先に行くだろう考え出しと可能性としてこれを投稿:

私はREADUNCOMMITTEDに設定されたのTransactionScopeを持っていたとき、私はこの動作を見ていた。

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

と私のLINQのSQLには、PROCの結果を返すために、ストアドプロシージャを呼び出していました。面白いのは、proc自身の中でWITH(NOLOCK)SQLヒントを指定できるため、ReadUncommittedトランザクションスコープでLinqをSQLクエリにラップする必要がないということです。 (少なくとも私の場合)

1

私は、いくつかのデータを読んで、その場で(修正がまだ進行中の間に)変更しようとしていると思います。
この場合、最も簡単なオプションは、すべてのデータを最初に読み取ることです(IEnumerable <> .ToList()の拡張メソッドを使用して)。次に、データに対するすべての操作を実行します。

+0

これは、上記の同様の問題で私の問題であったので、私から+1しました:) – James

0

私はこれが古いスレッドだと知っていますが、これは私の答えを追加する価値があると思ったので、このエラーでGoogleのトップレベルヒットです。私の場合、Entity Frameworkを使用していたので、たとえそれが適用されているのか確かめられていませんでしたが、EFを使用している人もいます。私の場合は、格納されたprocを呼び出していて、返された行を何もしないためです。 EFは行を読み戻さなかったので、これは「オープン操作」でした。私の解決策は、すべてのプロシージャコールの最後にFirst()を追加することでした。

myentities.CallMyStoredProc(A, B, C).First(); 
関連する問題