トランザクション オブジェクトのプール
プールされたトランザクション コンポーネントには、特別な要件があります。
リソースの手動参加
トランザクションに参加するプール可能オブジェクトは、管理対象リソースを手動で参加させる必要があります。 オブジェクトがクライアント間の管理対象リソースを保持している場合、特定のコンテキストでオブジェクトがアクティブ化されたときに、リソース マネージャーがトランザクションに自動的に参加させる方法はありません。
オブジェクト自体は、トランザクションを検出して、リソース マネージャーの自動参加を無効にし、保持しているリソースを手動で参加させるロジックを処理する必要があります。 これを行う手順は、使用しているリソース マネージャーに固有です。 手動参加を行う必要がある場合は、リソース マネージャーに関するドキュメントをご覧ください。
以下で説明するとおり、トランザクションがアクティブな間はオブジェクトをトランザクション アフィニティを使ってプールできます。そのトランザクションに関連付けられているクライアントによって呼び出された場合は、トランザクション アフィニティを使ってアクティブ化できます。 リソースを参加させる前に、まずトランザクション アフィニティをチェックする必要があります。 オブジェクトがそのトランザクションに固有のプールから取得された場合、そのオブジェクトはそのトランザクションで既に処理を行い、そのリソースに参加しています。
自動参加の無効化
リソースが取得されたら、通常はオブジェクトのコンストラクターで自動参加を無効にする必要があります。 つまり、自動参加を無効にしてから接続します。
自動参加を無効にすると、特に階層化されたデータ アクセス プロバイダーの場合、細かい手順になることがあります。 自動参加は、ODBC のように接続プールと組み合わせて使用されることもあれば、OLE DB のように組み合わせて使用されないこともあります。 場合によっては、複数レベルのプロバイダーで自動参加が無効になっていることを確認する必要があります。
IObjectControl の実装
トランザクションに参加するプール可能オブジェクトは、保持しているリソースの現在の状態を監視する必要があります。 オブジェクトが再利用可能状態であることを検出した場合 (たとえば、接続に問題がある場合)、IObjectControl::CanBePooled には False を返します。 これにより、オブジェクト インスタンスの破棄と現在のトランザクションの終了の両方に影響が及びます。
トランザクション固有のプール
オブジェクトのプールは一般に同種であるため、現在使用されていないプールされたオブジェクトは、任意のクライアントに戻って問題ありません。 このルールの唯一の例外は、オブジェクト プールが最適化されているトランザクション オブジェクトの場合です。 オブジェクトを要求するクライアントにトランザクションが関連付けられている場合、COM+ はそのトランザクションに既に関連付けられている使用可能なオブジェクトをプールでスキャンします。 トランザクション アフィニティを持つオブジェクトが見つかった場合、クライアントに返されます。それ以外の場合、汎用プールのオブジェクトが返されます。
この方法では、特定のトランザクションに対してアフィニティを持つオブジェクトを含む特殊なサブプールが保持されます。 トランザクションがコミットまたは中止されると、これらのオブジェクトはトランザクション アフィニティなしで汎用プールに返され、任意のクライアントが使用可能な状態になります。
このため、コンポーネントが管理対象リソースをトランザクションに手動で参加させるときは、まず、既に参加しているかどうかを確認する必要があります。 その場合、参加する必要はありません。
関連トピック