2

TransactionScopeOption.Required について 3 つの質問があります。それは私を夢中にさせ、オンラインでそれらを見つけることができません。

A.考えるのに苦労しています。実際にいつこのコードを書かなければならないのでしょうか? DoSomething2() を TransactionScope4 の外の TransactionScope3 に置くべきではないのはなぜですか?
B.この後: TransactionScope4.Complete()、TransactionScope3 も Complete であるため、同じ TransactionScope ですよね?
C. WCF では、クライアントで TransactionScope を使用してサービスのメソッドを呼び出すと、各メソッドはクライアントで作成した TransactionScope を使用するか、新しいものを作成しますか? なぜ新しいものを作成する必要があるのですか?メソッドが新しいものを作成する場合、属性: TransactionAutoComplete が存在するのはなぜですか?

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

1 に答える 1

2

ここに文書化された重要な文があります:

リソース マネージャー間のコミットの実際の作業は、TransactionScope オブジェクトがトランザクションを作成した場合、 End Using ステートメントで発生します。トランザクションを作成しなかった場合は、CommittableTransaction オブジェクトの所有者が Commit を呼び出すたびにコミットが発生します。

したがって、質問BTransactionScope4.Complete()に答えるには、その TransactionScope インスタンスが のトランザクションを再利用するため、への呼び出しはトランザクションをコミットしませんTransactionScope3

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

于 2012-04-26T22:57:55.373 に答える