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

System.Transactions 名前空間は、この名前空間を使用して作成されたトランザクション オブジェクトと COM+ によって作成されたトランザクションとの間の相互運用をサポートします。The System.Transactions namespace supports interoperability between transaction objects created using this namespace and transactions created through COM+.

新しい EnterpriseServicesInteropOption インスタンスを作成する際に TransactionScope 列挙体を使用すれば、COM+ との相互運用性のレベルを指定することができます。You can use the EnterpriseServicesInteropOption enumeration when you create a new TransactionScope instance to specify the level of interoperability with COM+.

既定で、アプリケーション コードは、静的なをチェックする際にCurrentプロパティ、System.Transactionsそれ以外の場合の現在のトランザクションを検索する試行またはTransactionScopeことを指示するオブジェクトCurrentnull.By default, when your application code checks the static Current property, System.Transactions attempts to look for a transaction that is otherwise current, or a TransactionScope object that dictates that Current is null. どちらも見つからないと、System.Transactions は COM+ コンテキストに照会してトランザクションを探します。If it cannot find either one of these, System.Transactions queries the COM+ context for a transaction. System.Transactions は、COM+ コンテキストからトランザクションが見つかる場合でも、System.Transactions にネイティブなトランザクションを優先します。Note that even though System.Transactions may find a transaction from the COM+ context, it still favors transactions that are native to System.Transactions.

相互運用性のレベルInteroperability levels

EnterpriseServicesInteropOption 列挙体は、NoneFull、および Automatic の各相互運用性レベルを定義します。The EnterpriseServicesInteropOption enumeration defines the following levels of interoperability—None, Full and Automatic.

TransactionScope クラスは、EnterpriseServicesInteropOption をパラメーターとして受け入れるコンストラクターを提供します。The TransactionScope class provides constructors that accept EnterpriseServicesInteropOption as a parameter.

None、名前が示すように、間の相互運用性がないことを意味System.EnterpriseServicesコンテキストとトランザクションのスコープ。None, as the name implies, implies that there is no interoperability between System.EnterpriseServices contexts and transaction scopes. TransactionScopeNone オブジェクトを作成した場合は、その後 Current にどのような変更を加えても、その変更が COM+ コンテキストに反映されることはありません。After creating a TransactionScope object with None, any changes to Current are not reflected in the COM+ context. 同様に、COM+ コンテキスト内のトランザクションに対する変更も Current には反映されません。Similarly, changes to the transaction in the COM+ context are not reflected in Current. 追加の同期は必要ないため、これは System.Transactions に対する最速の操作モードです。This is the fastest mode of operation for System.Transactions because there is no extra synchronization required. None は、TransactionScope をパラメーターとして受け入れないすべてのコンストラクターで、EnterpriseServicesInteropOption よって使用される既定値です。None is the default value used by TransactionScope with all constructors that do not accept EnterpriseServicesInteropOption as a parameter.

System.EnterpriseServices トランザクションをアンビエント トランザクションと組み合わせる場合は、Full または Automatic のいずれかを使用する必要があります。If you do want to combine System.EnterpriseServices transactions with your ambient transaction, you need to use either Full or Automatic. これらの値はいずれもコンポーネントのないサービスと呼ばれる機能に依存するため、これらの値を使用する際には Windows XP Service Pack 2 または Windows Server 2003 が稼働している必要があります。Both of these values rely on a feature called services without components, and therefore you should be running on Windows XP Service Pack 2 or Windows Server 2003 when using them.

Full は、System.TransactionsSystem.EnterpriseServices のアンビエント トランザクションが常に同じものであることを指定します。Full specifies that the ambient transactions for System.Transactions and System.EnterpriseServices are always the same. 結果として、新しい System.EnterpriseServices トランザクション コンテキストが作成され、そのコンテキストにとって TransactionScope が最新になるようにするため最新のトランザクションが適用されます。It results in creating a new System.EnterpriseServices transactional context and applying the transaction that is current for the TransactionScope to be current for that context. そのため、Current のトランザクションは Transaction のトランザクションと完全に同期することになります。As such, the transaction in Current is completely in synchronization with the transaction in Transaction. この値を使用すると、新しい COM+ コンテキストを作成しなければならない場合があるため、パフォーマンスが低下します。This value introduces a performance penalty because new COM+ contexts may need to be created.

Automatic 次の要件を指定します。Automatic specifies the following requirements:

  • Current が検査されると、System.Transactions は、既定のコンテキスト以外のコンテキストで実行されていることを検出した場合、COM+ コンテキスト内のトランザクションをサポートする必要があります。When Current is checked, System.Transactions should support transactions in the COM+ context if it detects that it is running in a context other than the default context. 既定のコンテキストには、トランザクションを含めることができません。Note that the default context cannot contain a transaction. したがって、既定のコンテキストでは、Automatic を使用した場合でも、System.Transactions によって使用されるスレッド ローカル ストレージに格納されているトランザクションが Current に対して返されます。Therefore, in the default context, even with Automatic, the transaction stored in the thread local storage used by System.Transactions is returned for Current.

  • 新しい TransactionScope オブジェクトが作成され、その作成が既定のコンテキスト以外のコンテキストで行われた場合は、TransactionScope オブジェクトにとって最新であるトランザクションが COM+ に反映される必要があります。If a new TransactionScope object is created and the creation occurs in a context other than the default context, the transaction that is current for the TransactionScope object should be reflected in COM+. この場合、Automatic は、新しい COM+ コンテキストを作成するという点で、Full と同様に動作します。In this case, Automatic behaves like Full in that it creates a new COM+ context.

さらに、CurrentFull の両方で Automatic が設定されると、これらのモードはいずれも、Current を直接設定できないことを示します。In addition when Current is set in both Full and Automatic, both of these modes imply that Current cannot be set directly. Current を作成する以外に TransactionScope を直接設定しようとすると、InvalidOperationException が発生します。Any attempt to set Current directly other than creating a TransactionScope results in an InvalidOperationException. EnterpriseServicesInteropOption 列挙値には、使用する値を明示的に指定しない新しいトランザクション スコープが継承されます。The EnterpriseServicesInteropOption enumeration value is inherited by new transaction scopes that do not explicitly specify which value to use. たとえば、新しい TransactionScope オブジェクトを Full で作成した後、2 番目の TransactionScope オブジェクトを作成した場合 (ただし、EnterpriseServicesInteropOption 値を指定しない)、その 2 番目の TransactionScope オブジェクトも Full を持つことになります。For example, if you create a new TransactionScope object with Full, and then create a second TransactionScope object but do not specify an EnterpriseServicesInteropOption value, the second TransactionScope object also has a Full.

要約すると、新しいトランザクション スコープを作成するときには次の規則が適用されます。In summary, the following rules apply when creating a new transaction scope:

  1. Current トランザクションがないかどうかチェックされます。Current is checked to see if there is a transaction. この検査の結果、次のことが行われます。This check results in:

    • スコープがあるかどうかが検査されます。A check to see if there is a scope.

    • スコープがある場合は、そのスコープが最初に作成されたときに渡された EnterpriseServicesInteropOption 列挙体の値が検査されます。If there is a scope, the value of the EnterpriseServicesInteropOption enumeration passed in when the scope was initially created is checked.

    • EnterpriseServicesInteropOption 列挙体が Automatic に設定された場合は、COM+ トランザクション (System.EnterpriseServices トランザクション) がマネージド スレッド ローカル ストレージ内の System.Transactions トランザクションよりも優先されます。If the EnterpriseServicesInteropOption enumeration is set to Automatic, the COM+ transaction (System.EnterpriseServices Transaction) takes precedence over the System.Transactions transaction in managed thread local storage.

      値が None に設定された場合は、マネージド スレッド ローカル ストレージ内の System.Transactions トランザクションが優先されます。If the value is set to None, the System.Transactions transaction in managed thread local storage takes precedence.

      値が Full の場合は、トランザクションは 1 つだけあり、それは COM+ トランザクションです。If the value is Full, there is only one transaction and it is a COM+ transaction.

  2. TransactionScopeOption コンストラクターによって渡された TransactionScope 列挙体の値が検査されます。The value of the TransactionScopeOption enumeration passed in by the TransactionScope constructor is checked. これにより、新しいトランザクションを作成する必要があるかどうかが決定されます。This determines if a new transaction must be created.

  3. 新しいトランザクションを作成する場合は、EnterpriseServicesInteropOption の値に応じてそれぞれ次のようになります。If a new transaction is to be created, the following values of EnterpriseServicesInteropOption result in:

    • Full: COM+ コンテキストに関連付けられたトランザクションが作成されます。Full: a transaction associated with a COM+ context is created.

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

    • Automatic: COM + コンテキストがある場合、トランザクションが作成され、コンテキストにアタッチします。Automatic: if there is a COM+ context, a transaction is created and attached to the context.

次の表は、Enterprise Services (ES) コンテキストと、EnterpriseServicesInteropOption 列挙体を使用するトランザクションを必要とするトランザクション スコープを示しています。The following table illustrates the Enterprise Services (ES) context and a transactional scope that requires a transaction using the EnterpriseServicesInteropOption enumeration.

ES コンテキストES Context なしNone 自動Automatic フルFull
既定のコンテキストDefault context 既定のコンテキストDefault context 既定のコンテキストDefault context 新規作成Create new
コンテキストの作成transactional context
既定以外のコンテキストNon-default context クライアントのコンテキストの保守Maintain client's context 新しいトランザクション コンテキストの作成Create new transactional context 新しいトランザクション コンテキストの作成Create new transactional context

次の表は、特定の System.EnterpriseServices コンテキストと、EnterpriseServicesInteropOption 列挙体を使用するトランザクションを必要とするトランザクション スコープがあると、アンビエント トランザクションがどうなるかを示しています。The following table illustrates what the ambient transaction is, given a particular System.EnterpriseServices context, and a transactional scope that requires a transaction using the EnterpriseServicesInteropOption enumeration.

ES コンテキストES Context なしNone 自動Automatic フルFull
既定のコンテキストDefault context STST STST ESES
既定以外のコンテキストNon-default context STST ESES ESES

注: In the preceding table:

  • ST は、スコープのアンビエント トランザクションが System.Transactions によって管理され、どの System.EnterpriseServices コンテキストのトランザクション (存在する場合) にも関連付けられていないことを示します。ST means that the scope's ambient transaction is managed by System.Transactions, separate from any System.EnterpriseServices context's transaction that may be present.

  • ES は、スコープのアンビエント トランザクションが System.EnterpriseServices コンテキストのトランザクションと同じものであることを示します。ES means that the scope's ambient transaction is same as the System.EnterpriseServices context's transaction.