2009-08-25 25 views
3

トランザクションスコープ内でEntity Frameworkとユニットテストを実行しています。我々は元々タイトルに誤りを抱えていた。廃棄オブジェクトにアクセスできません。トランザクション

私は何か問題を特定することができました。

using (TransactionScope scope1 = new TransactionScope()) 
{ 
    using (TransactionScope scope2 = new TransactionScope()) 
    { 
      // Here there is no code 
    } 

    using (Entities se = new Entities()) 
    { 
     EntityConnection entityConnection = (EntityConnection)se.Connection; 
     DbConnection storeConnection = entityConnection.StoreConnection; 

     storeConnection.Open(); // On this line the error occurs 

      // Some code that runs a stored procedure 
    } 
} 

我々が現在取得しているエラーは、「操作はトランザクションの状態には有効ではありません..」である

私はトランザクションscope2を削除すると、すべてが正常に動作します。

スコープ2をアンビエントトランザクションとしてマークすると、正常に動作します。

答えて

6

あなたはこのコンストラクタに等しいトランザクション スコープオプションを使用して新しい トランザクションスコープを作成TransactionScope Constructor

内のセクション備考を参照してください、TransactionScopeOption.Requiredのデフォルトを生成する明示的なTransactionScopeOptionパラメータ、なしscope2を作成しています必須。この は、トランザクションが新しいスコープで が必要であり、すでに が存在する場合は、周囲の トランザクションが使用されることを意味します。それ以外の場合は、スコープに入る前に新しい トランザクションを作成します。あなたの例では

周囲TransactionScopeは確かに結果的に暗黙のパラメータTransactionScopeOption.Requiredで新しいネストされたTransactionScopescope2)は、既存の周囲のトランザクションを使用してではなく、新しいトランザクション自体を作成して、すでに(scope1)が存在しません。これを呼び出すに失敗

しかし、scope2の暗黙的なトランザクションのセマンティクスを使用すると、scope2の終わりにCompleteを呼び出しされていないため、結果的にscope1によって作成された既存の周囲のトランザクションが中止取得され、所定の位置に残っていますトランザクション マネージャは、システム 障害としてこれを解釈し、またはトランザクションの範囲内でスローされた例外 に相当するための方法は、 トランザクションをアボート

あなたがscope2を削除するか、TransactionScopeOption.RequiresNewにその意味を変更する場合はもちろんの問題は遠かった直後に行く(を意味する「新しいトランザクションは常にスコープのために作成されています。」)、scope1によって作成された既存の周囲のトランザクションはされませんので、もう影響を受けませんでした。

Implementing an Implicit Transaction using Transaction Scopeを参照してください。

+0

それを固定おかげで、私は(scope2.completeがありませんでした) –

0

この構文については、これはかなりよく似ていますが、Scope2は後で完了し、破棄されます。

また、「オブジェクトの廃棄処理にアクセスできない」というエラーが表示される TransactionScopeOption.Requiredではなく、TransactionScopeOption.RequiresNewでこれらの両方を作成する必要がありますか?

TransactionOptions rootOptions = new TransactionOptions(); 
    rootOptions.IsolationLevel = IsolationLevel.ReadCommitted; 
    OtherObject.Scope2 = new TransactionScope(TransactionScopeOption.Required, rootOptions); 

    TransactionOptions options = new TransactionOptions(); 
    options.IsolationLevel = IsolationLevel.ReadCommitted; 
    options.Timeout = getTransactionTimeout(); 
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options)) 
       { 

           ............. 
        scope.Complete(); 
       } 
+0

こんにちは、私はまた、intermitentが「破棄されたオブジェクトにアクセスできないことを見る名前オブジェクト:。。 『のTransactionScope』をあなたもこれを修正しましたか? – Tasio

関連する問題