複数のトランザクションの構成
トランザクション属性は、コンポーネント開発者のトランザクションを自動的に管理する宣言型プロパティです。 この属性を設定すると、コンポーネントで明示的なトランザクション制御を使用する必要がなくなります。
COM+ は、コンポーネントのトランザクション属性を使用して、アクティブ化する各オブジェクトに必要なトランザクション保護の種類を決定します。 オブジェクトは、その要件に応じて、呼び出し元のトランザクションを共有したり、新しいトランザクションを要求したり、トランザクション保護なしで動作したりできます。
COM+ には、次のトランザクション属性値が用意されています。
-
Disabled
-
一般に、コンポーネントがリソース マネージャーにアクセスしない場合にのみ、この属性値を設定する必要があります。 トランザクション属性を無効にすると、COM+ は、オブジェクトのコンテキスト配置を決定する際のコンポーネントのトランザクション要件を無視します。 その結果、オブジェクトは呼び出し元のコンテキスト (およびトランザクション) を共有できます。 COM コンポーネントを COM+ に移行する場合、未構成の COM コンポーネントと同じトランザクション動作をメインするには、トランザクション属性を無効にする必要があります。
Note
未構成コンポーネントは、COM+ アプリケーションにインストールされていない COM コンポーネントです。
-
サポートされていません
-
この属性値を設定すると、COM+ は、呼び出し元のトランザクション状態に関係なく、コンポーネントから作成されたオブジェクトがトランザクションに参加しないようにします。 この値を宣言することで、オブジェクトが呼び出し元のトランザクションで投票することも、独自のトランザクションを開始することもできないようにします。 サポートされていませんが、すべてのコンポーネントの既定値です。
-
サポートあり
-
この属性値を設定すると、コンポーネントから作成されたオブジェクトが存在する場合、そのコンポーネントから作成されたすべてのオブジェクトがトランザクションに参加します。 この値は、オブジェクトが独自のトランザクションを必要とせずに呼び出し元のトランザクションで共有する場合に宣言します。
-
必須。
-
この属性値を設定すると、COM+ によって、コンポーネントから作成されたすべてのオブジェクトがトランザクションになります。 COM+ が [必須] 設定でオブジェクトをアクティブ化すると、呼び出し元のトランザクション状態が確認されます。 呼び出し元にトランザクションがある場合、新しいオブジェクトは現在のトランザクションに含まれます。 それ以外の場合、COM+ はトランザクションを開始し、新しいオブジェクトをトランザクションのルートにします。 これは、リソース アクティビティを実行するコンポーネントに推奨される設定です。これらのアクティビティのトランザクション保護を提供するのに役立ちます。
-
RequiresNew
-
この属性値を設定すると、COM+ は、呼び出し元のトランザクション状態に関係なく、コンポーネントから作成されたすべてのオブジェクトがトランザクションのルートとして新しいトランザクションに参加する必要があることを保証します。 COM+ は、呼び出し元のトランザクションとは異なる新しいトランザクションを自動的に開始します。
Note
COM+ では、入れ子になったトランザクションはサポートされていません。 1 つのトランザクション オブジェクトが 、新しい必須としてマークされている別のコンポーネントを呼び出すと、COM+ は、新しくアクティブ化されたオブジェクトの独立したトランザクション境界を作成します。 2 番目のトランザクションは、最初のトランザクションが 2 番目のトランザクションの結果を明示的にメモし、それらの結果に基づいて投票を変更しない限り、最初のトランザクションに影響を与えることはできません。
トランザクション属性の依存関係
次の表は、各 COM+ トランザクション属性値の特性を示しています。これには、トランザクション特性に対する値の影響も含まれます。 COM+ では、すべてのトランザクション コンポーネントに 対して JIT アクティブ化 と 同期 が適用されます。
属性値 | - 新しいトランザクション。 | トランザクション クライアント | トランザクション ルート | JIT アクティブ化 | 同期 |
---|---|---|---|---|---|
無効 |
なし |
可能性あり |
なし |
省略可能 |
省略可能 |
サポートされていません |
なし |
なし |
なし |
省略可能 |
省略可能 |
サポートされています |
なし |
クライアントにトランザクションがある場合 |
なし |
必須 |
Required |
必須 |
可能性あり |
クライアントにトランザクションがある場合 |
クライアントにトランザクションがない場合 |
必須 |
必須 |
RequiresNew |
常時 |
なし |
常時 |
必須 |
必須 |
トランザクションの境界
トランザクションには開始と終了があり、1 回だけ発生します。 トランザクションの実行中に、1 つ以上のタスクを実行するために、データベースやキューなどのリソースに対してトランザクションが呼び出される場合があります。 各リソースは、トランザクション境界内にあります。 複数のプロセスとコンピューターの境界にまたがる可能性があるトランザクション境界内のすべてのリソースは、1 つのトランザクションを共有します。 これらのプロセスとコンピューターの境界を越えた一貫性の管理は重要です。
COM+ は、各コンポーネントに設定したトランザクション属性の値に基づいて、トランザクション境界を自動的に管理することで一貫性を確保します。 COM+ トランザクションは、トランザクションに参加するように指示されたオブジェクトに自動的にフローし、トランザクションの外部で実行するように指示されたオブジェクトをバイパスします。 COM+ では、入れ子になったトランザクションはサポートされていません。 代わりに、COM+ トランザクションは個別で有効期間が短くなります。
トランザクション境界内の最初のオブジェクトは、トランザクションに対して特殊であり、トランザクションの ルート オブジェクト と呼ばれます。 トランザクション内に存在できるルート オブジェクトは 1 つだけです。 ルート オブジェクトのトランザクション階層内の他のすべてのオブジェクトは、内部オブジェクトと呼ばれます。
トランザクションの入れ子
オブジェクトが正しいトランザクション境界に含まれていることを確認する 1 つの方法は、コンポーネントの記述を開始する前にトランザクションをマップすることです。 トランザクションをマッピングすることで、書き込むコンポーネントごとに最適な設定を決定できます。 コンポーネントの使用方法が確実であるほど、適切なトランザクション属性値を簡単に選択できます。
実行時に、COM+ はトランザクション属性を調べて、オブジェクトを新しいトランザクションのルートにするか、既存のトランザクションで作成するか、非トランザクション オブジェクトとして作成するかを決定します。
次の図は、考えられるトランザクション マッピングを示しています。 この図では、クライアントはオブジェクト 1 を作成します。これにはトランザクションが必要です。 トランザクションが存在しないため、COM+ はトランザクション 1 を作成し、オブジェクト 1 をルート オブジェクトとして配置します。 オブジェクト 1 はオブジェクト 2 を作成します。オブジェクト 2 はトランザクションをサポートするため、トランザクション 1 に配置されます。 オブジェクト 2 はオブジェクト 3 を作成します。オブジェクト 3 はトランザクションをサポートしていないため、すべてのトランザクションの外部に配置されます。 オブジェクト 2 ではオブジェクト 4 も作成されます。オブジェクト 4 はトランザクションを必要とするため、トランザクション 1 に配置されます。 オブジェクト 3 は、トランザクションをサポートするオブジェクト 5 を作成します。 ただし、オブジェクト 5 はトランザクション内に存在しないオブジェクトによって作成されるため、すべてのトランザクションの外部にも配置されます。 オブジェクト 4 は、新しいトランザクションを必要とするオブジェクト 6 を作成するため、COM+ はトランザクション 2 を作成し、オブジェクト 6 をルート オブジェクトとして配置します。 オブジェクト 6 はオブジェクト 7 を作成します。オブジェクト 7 はトランザクションをサポートするため、トランザクション 2 に配置されます。
上の図は、2 つの潜在的な問題領域を示しています。 まず、作業の大部分は、2 つの異なるトランザクション間で分割されます。 オブジェクト 4 でオブジェクト 6 が作成された後にトランザクション 1 が失敗した場合、トランザクション 2 はトランザクション 1 の結果の影響を受けません。 この結果が意図しない場合は、オブジェクト 6 のトランザクション属性を Required に変更することで、両方のトランザクションの操作を 1 つのトランザクションに折りたたむことができます。
マッピング図は、オブジェクト 3 とオブジェクト 5 が非トランザクションであり、トランザクション 1 と 2 の範囲外で完全に実行されていることを示しています。 オブジェクト 5 が永続データを更新する場合は、その非トランザクション状態を再検討する必要があります。 オブジェクト 5 は、トランザクション属性を Required に変更することで、トランザクション内に配置できます。