2012-04-26 1 views
2

TransactionScopeOptionについて3つの質問があります。私は夢中になり、オンラインでアンサーを見つけることができません。C#/ WCF TransactionScopeOption.Required

a実際に考えると難しい時がありますが、このコードを書く必要がありますか?なぜ私はちょうどDoSomething2()をTransactionScope4の外に置くべきではないのですか?
B.この後:TransactionScope4.Complete()、TransactionScope3もCompleteと同じですか?
C. WCFでは、クライアントでTransactionScopeを使用していくつかのサービスのメソッドを呼び出すと、各メソッドはクライアントまたはCreatで作成したTransactionScopeを使用します。なぜ新しいものを作り出すべきなのでしょうか?メソッドが新しいものを作成する場合は、という属性はなぜですか:TransactionAutoComplete exsist?

using (TransactionScope TransactionScope3 = new TransactionScope()) 
      { 
       Service1.DoSomething1(); 
       using (TransactionScope TransactionScope4 = new TransactionScope(TransactionScopeOption.Required)) 
       { 
        Service1.DoSomething2(); 
        TransactionScope4.Complete(); 
       } 
       TransactionScope3.Complete(); 
      } 

答えて

1

キーセンテンスはありhereを文書化:

のTransactionScopeオブジェクトがトランザクションを作成した場合、リソースマネージャとの間でコミットの実際の作業は声明を使用して、エンドで起こります。トランザクションを作成しなかった場合は、CommitがCommittableTransactionオブジェクトの所有者によって呼び出されるたびにコミットが発生します。

そのTransactionScopeのインスタンスを再利用TransactionScope3のトランザクションを持っているでしょうので、そこで問題Bに答えるために、無TransactionScope4.Complete()へのお電話は、トランザクションをコミットしません。

答えがCの場合、WCFサービスにトランザクションが必要であることを示すと、クライアントに既存のTransactionScopeが作成されていれば、WCFは新しいトランザクションを開始しません。上記と同じ理由でサービスコールが終了します)。ただし、クライアントに開いているTransactionScopeがない場合、WCFは新しいサービスを開始し、サービスコールの終了時に自動的にコミットまたはロールバックします。

+0

最初にすばらしいコメントをいただきありがとうございます。第二に、あなたのアンサーから質問Cまで、クライアントでTransactionScopeを作成しなかった場合にのみ、TransactionAutoCompleteを使用する必要があります。私は正しい? –

+0

Btw、私はあなたのアンサーを有用にすることができないのを知ったので、私はちょうどそれを言うでしょう:あなたは非常に便利でした!ありがとう。 –

+0

すべてのネストされたトランザクションスコープでComplete()を呼び出す必要があるかどうかわかりません。それをテストしたいかもしれませんが、 'TransactionAutoComplete'設定は基本的にWCFに' Complete() 'を自動的に呼び出すように指示します。私はクライアントがそれを作成したとしても、サーバのトランザクションスコープでまだ完全()を呼び出すのがベストプラクティスであると思います。 (換言すれば、あなたのケースでは「真」に設定することをお勧めします) – CodingWithSpike

関連する問題