2009-08-27 54 views
6

トランザクションを作成し、サブトランザクションにデータを書き込んだり、データを読み込んだり、トランザクションをロールバックしたいとします。複数のTransactionScopeの問題

using(var transaction = new TransactionScope()) 
{ 
    using(var transaction = new TransactionScope()) 
    { 
      // save data via LINQ/DataContext 
      transaction.Complete(); 
    } 
    // Get back for assertions 
    var tempItem = // read data via LINQ/DataContext THROWS EXCEPTION 
} 

しかし、読みながら、私は「System.Transactions.TransactionExceptionを:操作はトランザクションの状態には有効ではありません。」を得ます。

これを回避するには、どのようにトランザクションプロパティを設定する必要がありますか?

+0

どのデータベースを使用していますか? – TheVillageIdiot

+0

のMicrosoft SQL 2005 – boj

+0

は http://stackoverflow.com/questions/2884863/under-what-c​​ircumstances-is-an-sqlconnection-automatically-enlisted-in-an-ambien – Joe

答えて

9

この例外は完全なスタックトレースなしではデバッグできません。それは文脈によって異なる意味を持つ。通常、トランザクション内ではいけないことをやっていることを意味しますが、dbコールやスタックトレースを見ることなく、誰でも実行できるのは推測です。私の知っている(これは私は確信している総合的な意味がないことである)いくつかの一般的な原因は次のとおりです。

  1. は、ネストされたTransactionScope内で複数のデータソース(すなわち、異なる接続文字列)にアクセスします。これにより分散トランザクションへの昇格が行われ、DTCを実行していない場合は失敗します。 DTCを有効にするには、でないではなく、トランザクションをクリーンアップするか、新しいTransactionScope(TransactionOptions.RequiresNew)を使用して他のデータアクセスをラップしてください。
  2. TransactionScope内の処理されない例外。
  3. 単なる挿入/更新された行を読み込もうとするなど、分離レベルに違反する操作。
  4. SQLデッドロック。場合によってはトランザクションがデッドロックする可能性もありますが、#1が適用されると、他のopsを新しいトランザクションに隔離すると、慎重でないとデッドロックが発生する可能性があります。
  5. トランザクションタイムアウト。
  6. データベースからの他のエラー。

私は確かにすべての可能な原因を知っていませんが、完全なスタックトレースと実際のdbコールをコードに投稿すると、私は一見を見て、何かが見えたら教えてくれます。

+0

アンディ、この回答に感謝します。 #3の質問: "分離レベルに違反するすべての操作"。次のことが分離レベルに違反していますか? DECLARE(atSmbol)someCount INT; 更新dbo。何かSET(atSmbol)someCount = [SomeCount] = [SomeCount] + 1 WHERE ID = 123 私の用法(atSmbol)では、someCountは出力パラメータです。 もしそうなら、これは隔離レベルに違反しないでしょうか? DECLARE(atSmbol)someCount INT; UPDATE dbo.Something SET [SomeCount] =(atSmbol)someCount = [SomeCount] + 1 WHERE ID = 123 注意、私はatシンボルを使用するときに誰かに通知するようタグ付けしようとしていると考えています。 – Wes

4

2つの入れ子にされたTransactionScopeオブジェクトがありますか?

try try catchブロックはありません。

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

は、私はそれが無効な状態にあります、あなたは特定の答えはあなたが何も始まって​​いないトランザクションを完了することができないということである見つけると思います。 LINQのコメントがあるコードは実際にありますか?実際に接続が確立されていますか?

+0

はい、入れ子に役立つかもしれません。しかし、なぜあなたはMSDNをリンクしていますか? – boj

+0

リンクされた記事がなぜその例外を取得しているのかを説明しているので、おそらく? –

+0

@boj:それは何が起こっているのかをよく説明した使用例を示しています。 –

関連する問題