System.Transactions インフラストラクチャは、Transaction クラスに基づく明示的なプログラミング モデルだけでなく、インフラストラクチャがトランザクションを自動的に管理する、TransactionScope クラスを使用した暗黙のプログラミング モデルも提供します。
new ステートメントで TransactionScope をインスタンス化すると、トランザクション マネージャによって参加するトランザクションが決定されます。いったん決定されると、このスコープは常にそのトランザクションに参加します。この決定は 2 つの要因に基づいて行われます。1 つはアンビエント トランザクションが存在するかどうか、もう 1 つはコンストラクタの TransactionScopeOption パラメータの値です。アンビエント トランザクションとは、その中でコードが実行されるトランザクションです。Transaction クラスの静的 Current プロパティを呼び出すことによってアンビエント トランザクションへの参照を取得できます。このパラメータの使用方法の詳細については、「トランザクション スコープを使用した暗黙的なトランザクションの実装」で、トランザクション フローの管理についての説明を参照してください。
トランザクション スコープ内 (つまり、TransactionScope オブジェクトの初期化からその Dispose メソッドの呼び出しまでの間) で例外が発生しなかった場合、スコープが参加しているトランザクションを続行できます。トランザクション スコープ内で例外が発生した場合、スコープが参加しているトランザクションはロールバックされます。
アプリケーションがトランザクション内で実行する必要のあるすべての作業を完了したら、トランザクション マネージャにトランザクションをコミットできることを知らせるために、Complete メソッドを一度だけ呼び出す必要があります。このメソッドを呼び出さないと、トランザクションが中止されます。
Dispose メソッドの呼び出しによって、トランザクション スコープの末尾がマークされます。このメソッドの呼び出し後に発生した例外は、トランザクションに影響しない場合があります。
スコープ内で Current の値を変更すると、Dispose を呼び出したときに例外がスローされます。ただし、スコープの末尾では以前の値が復元されます。また、トランザクションを作成したトランザクション スコープ内のCurrent で Dispose を呼び出した場合、このトランザクションはスコープの末尾で中止されます。