Enterprise Services および COM+ トランザクションとの相互運用性
System.Transactions 名前空間は、この名前空間を使用して作成されたトランザクション オブジェクトと COM+ によって作成されたトランザクションとの間の相互運用をサポートします。
新しい EnterpriseServicesInteropOption インスタンスを作成する際に TransactionScope 列挙体を使用すれば、COM+ との相互運用性のレベルを指定することができます。
既定では、アプリケーション コードによって静的 Current プロパティが検査されると、System.Transactions によって、その他の場合は最新であるトランザクション、または Current が null であることを指示する TransactionScope オブジェクトが探されます。 どちらも見つからないと、System.Transactions は COM+ コンテキストに照会してトランザクションを探します。 System.Transactions は、COM+ コンテキストからトランザクションが見つかる場合でも、System.Transactions にネイティブなトランザクションを優先します。
相互運用性のレベル
EnterpriseServicesInteropOption 列挙体は、None、Full、および Automatic の各相互運用性レベルを定義します。
TransactionScope クラスは、EnterpriseServicesInteropOption をパラメーターとして受け入れるコンストラクターを提供します。
None は、その名前が示すように、System.EnterpriseServices コンテキストとトランザクション スコープの間に相互運用性がないことを意味します。 TransactionScope で None オブジェクトを作成した場合は、その後 Current にどのような変更を加えても、その変更が COM+ コンテキストに反映されることはありません。 同様に、COM+ コンテキスト内のトランザクションに対する変更も Current には反映されません。 追加の同期は必要ないため、これは System.Transactions に対する最速の操作モードです。 None は、TransactionScope をパラメーターとして受け入れないすべてのコンストラクターで、EnterpriseServicesInteropOption よって使用される既定値です。
System.EnterpriseServices トランザクションをアンビエント トランザクションと組み合わせる場合は、Full または Automatic のいずれかを使用する必要があります。 これらの値はいずれもコンポーネントのないサービスと呼ばれる機能に依存するため、これらの値を使用する際には Windows XP Service Pack 2 または Windows Server 2003 が稼働している必要があります。
Full は、System.Transactions と System.EnterpriseServices のアンビエント トランザクションが常に同じものであることを指定します。 結果として、新しい System.EnterpriseServices トランザクション コンテキストが作成され、そのコンテキストにとって TransactionScope が最新になるようにするため最新のトランザクションが適用されます。 そのため、Current のトランザクションは Transaction のトランザクションと完全に同期することになります。 この値を使用すると、新しい COM+ コンテキストを作成しなければならない場合があるため、パフォーマンスが低下します。
Automatic では次の要件が指定されます。
Current が検査されると、System.Transactions は、既定のコンテキスト以外のコンテキストで実行されていることを検出した場合、COM+ コンテキスト内のトランザクションをサポートする必要があります。 既定のコンテキストには、トランザクションを含めることができません。 したがって、既定のコンテキストでは、Automatic を使用した場合でも、System.Transactions によって使用されるスレッド ローカル ストレージに格納されているトランザクションが Current に対して返されます。
新しい TransactionScope オブジェクトが作成され、その作成が既定のコンテキスト以外のコンテキストで行われた場合は、TransactionScope オブジェクトにとって最新であるトランザクションが COM+ に反映される必要があります。 この場合、Automatic は、新しい COM+ コンテキストを作成するという点で、Full と同様に動作します。
さらに、Current と Full の両方で Automatic が設定されると、これらのモードはいずれも、Current を直接設定できないことを示します。 Current を作成する以外に TransactionScope を直接設定しようとすると、InvalidOperationException が発生します。 EnterpriseServicesInteropOption 列挙値には、使用する値を明示的に指定しない新しいトランザクション スコープが継承されます。 たとえば、新しい TransactionScope オブジェクトを Full で作成した後、2 番目の TransactionScope オブジェクトを作成した場合 (ただし、EnterpriseServicesInteropOption 値を指定しない)、その 2 番目の TransactionScope オブジェクトも Full を持つことになります。
要約すると、新しいトランザクション スコープを作成するときには次の規則が適用されます。
Current は、トランザクションがあるかどうかを確認するために検査されます。 この検査の結果、次のことが行われます。
スコープがあるかどうかが検査されます。
スコープがある場合は、そのスコープが最初に作成されたときに渡された EnterpriseServicesInteropOption 列挙体の値が検査されます。
EnterpriseServicesInteropOption 列挙体が Automatic に設定された場合は、COM+ トランザクション (System.EnterpriseServices トランザクション) がマネージド スレッド ローカル ストレージ内の System.Transactions トランザクションよりも優先されます。
値が None に設定された場合は、マネージド スレッド ローカル ストレージ内の System.Transactions トランザクションが優先されます。
値が Full の場合は、トランザクションは 1 つだけあり、それは COM+ トランザクションです。
TransactionScopeOption コンストラクターによって渡された TransactionScope 列挙体の値が検査されます。 これにより、新しいトランザクションを作成する必要があるかどうかが決定されます。
新しいトランザクションを作成する場合は、EnterpriseServicesInteropOption の値に応じてそれぞれ次のようになります。
Full: COM+ コンテキストに関連付けられたトランザクションが作成されます。
None: System.Transactions トランザクションが作成されます。
Automatic: COM+ コンテキストがある場合は、トランザクションが作成され、コンテキストにアタッチされます。
次の表は、Enterprise Services (ES) コンテキストと、EnterpriseServicesInteropOption 列挙体を使用するトランザクションを必要とするトランザクション スコープを示しています。
ES コンテキスト | None | 自動 | 完全 |
---|---|---|---|
既定のコンテキスト | 既定のコンテキスト | 既定のコンテキスト | 新規作成 コンテキストの作成 |
既定以外のコンテキスト | クライアントのコンテキストの保守 | 新しいトランザクション コンテキストの作成 | 新しいトランザクション コンテキストの作成 |
次の表は、特定の System.EnterpriseServices コンテキストと、EnterpriseServicesInteropOption 列挙体を使用するトランザクションを必要とするトランザクション スコープがあると、アンビエント トランザクションがどうなるかを示しています。
ES コンテキスト | None | 自動 | 完全 |
---|---|---|---|
既定のコンテキスト | ST | ST | ES |
既定以外のコンテキスト | ST | ES | ES |
注:
ST は、スコープのアンビエント トランザクションが System.Transactions によって管理され、どの System.EnterpriseServices コンテキストのトランザクション (存在する場合) にも関連付けられていないことを示します。
ES は、スコープのアンビエント トランザクションが System.EnterpriseServices コンテキストのトランザクションと同じものであることを示します。
.NET