Enterprise Services および COM+ トランザクションとの相互運用性

System.Transactions 名前空間は、この名前空間を使用して作成されたトランザクション オブジェクトと COM+ によって作成されたトランザクションとの間の相互運用をサポートします。

新しい TransactionScope インスタンスを作成する際に EnterpriseServicesInteropOption 列挙体を使用すれば、COM+ との相互運用性のレベルを指定することができます。

既定では、アプリケーション コードが静的 Current プロパティを検査すると、System.Transactions は、その他の場合は最新であるトランザクション、または Currentnull であることを指示する TransactionScope オブジェクトを探します。どちらも見つからないと、System.Transactions は COM+ コンテキストに照会してトランザクションを探します。System.Transactions は、COM+ コンテキストからトランザクションが見つかる場合でも、System.Transactions にネイティブなトランザクションを優先します。

相互運用性のレベル

EnterpriseServicesInteropOption 列挙体は、NoneFull、および Automatic の各相互運用性レベルを定義します。

TransactionScope クラスは、EnterpriseServicesInteropOption をパラメータとして受け入れるコンストラクタを提供します。

None は、その名前が示すように、System.EnterpriseServices コンテキストとトランザクション スコープとの間に相互運用性がないことを意味します。NoneTransactionScope オブジェクトを作成した場合は、その後 Current にどのような変更を加えても、その変更が COM+ コンテキストに反映されることはありません。同様に、COM+ コンテキスト内のトランザクションに対する変更も Current には反映されません。追加の同期は必要ないため、これは System.Transactions に対する最速の操作モードです。None は、EnterpriseServicesInteropOption をパラメータとして受け入れないすべてのコンストラクタと共に TransactionScope によって使用される既定値です。

System.EnterpriseServices トランザクションをアンビエント トランザクションと組み合わせる場合は、Full または Automatic のいずれかを使用する必要があります。これらの値はいずれもコンポーネントのないサービスと呼ばれる機能に依存するため、これらの値を使用する際には Windows XP Service Pack 2 または Windows Server 2003 が稼働している必要があります。

Full は、System.TransactionsSystem.EnterpriseServices のアンビエント トランザクションが常に同じものであることを指定します。結果として、新しい System.EnterpriseServices トランザクション コンテキストが作成され、そのコンテキストにとって TransactionScope が最新になるようにするため最新のトランザクションが適用されます。そのため、Current のトランザクションは Transaction のトランザクションと完全に同期することになります。この値を使用すると、新しい COM+ コンテキストを作成しなければならない場合があるため、パフォーマンスが低下します。

Automatic は次の要件を指定します。

  • Current が検査されると、System.Transactions は、既定のコンテキスト以外のコンテキストで実行されていることを検出した場合、COM+ コンテキスト内のトランザクションをサポートする必要があります。既定のコンテキストには、トランザクションを含めることができません。したがって、既定のコンテキストでは、Automatic を使用した場合でも、System.Transactions によって使用されるスレッド ローカル ストレージに格納されているトランザクションが Current に対して返されます。

  • 新しい TransactionScope オブジェクトが作成され、その作成が既定のコンテキスト以外のコンテキストで行われた場合は、TransactionScope オブジェクトにとって最新であるトランザクションが COM+ に反映される必要があります。この場合、Automatic は、新しい COM+ コンテキストを作成するという点で、Full と同様に動作します。

さらに、FullAutomatic の両方で Current が設定されると、これらのモードはいずれも、Current を直接設定できないことを示します。TransactionScope を作成する以外に Current を直接設定しようとすると、InvalidOperationException が発生します。EnterpriseServicesInteropOption 列挙値には、使用する値を明示的に指定しない新しいトランザクション スコープが継承されます。たとえば、新しい TransactionScope オブジェクトを Full で作成した後、2 番目の TransactionScope オブジェクトを作成した場合 (ただし、EnterpriseServicesInteropOption 値を指定しない)、その 2 番目の TransactionScope オブジェクトも Full を持つことになります。

要約すると、新しいトランザクション スコープを作成するときには次の規則が適用されます。

  1. トランザクションがあるかどうかを調べるため Current が検査されます。この検査の結果、次のことが行われます。

    • スコープがあるかどうかが検査されます。

    • スコープがある場合は、そのスコープが最初に作成されたときに渡された EnterpriseServicesInteropOption 列挙体の値が検査されます。

    • EnterpriseServicesInteropOption 列挙体が Automatic に設定された場合は、COM+ トランザクション (System.EnterpriseServices トランザクション) がマネージ スレッド ローカル ストレージ内の System.Transactions トランザクションよりも優先されます。

      値が None に設定された場合は、マネージ スレッド ローカル ストレージ内の System.Transactions トランザクションが優先されます。

      値が Full の場合は、トランザクションは 1 つだけあり、それは COM+ トランザクションです。

  2. TransactionScope コンストラクタによって渡された TransactionScopeOption 列挙体の値が検査されます。これにより、新しいトランザクションを作成する必要があるかどうかが決定されます。

  3. 新しいトランザクションを作成する場合は、EnterpriseServicesInteropOption の値に応じてそれぞれ次のようになります。

    • Full: COM+ コンテキストに関連付けられたトランザクションが作成されます。

    • None: System.Transactions トランザクションが作成されます。

    • Automatic: COM+ コンテキストがある場合は、トランザクションが作成され、そのコンテキストに関連付けられます。

次の表は、Enterprise Services (ES) コンテキストと、EnterpriseServicesInteropOption 列挙体を使用するトランザクションを必要とするトランザクション スコープを示しています。

ES コンテキスト なし 自動 完全

既定のコンテキスト

既定のコンテキスト

既定のコンテキスト

新しいトランザクション コンテキストの作成

既定以外のコンテキスト

クライアントのコンテキストの保守

新しいトランザクション コンテキストの作成

新しいトランザクション コンテキストの作成

次の表は、特定の System.EnterpriseServices コンテキストと、EnterpriseServicesInteropOption 列挙体を使用するトランザクションを必要とするトランザクション スコープがあると、アンビエント トランザクションがどうなるかを示しています。

ES コンテキスト なし 自動 完全

既定のコンテキスト

ST

ST

ES

既定以外のコンテキスト

ST

ES

ES

注:

  • ST は、スコープのアンビエント トランザクションが System.Transactions によって管理され、どの System.EnterpriseServices コンテキストのトランザクション (存在する場合) にも関連付けられていないことを示します。

  • ES は、スコープのアンビエント トランザクションが System.EnterpriseServices コンテキストのトランザクションと同じものであることを示します。

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.