上位トランザクション マネージャーの作成

KTM において、上位トランザクション マネージャーは、参加しているトランザクションの上位エンリストを作成するリソース マネージャーです。 上位エンリストは、リソース マネージャーに対し、エンリストのトランザクションのコミット操作を調整する権限を付与するエンリストです。 つまり、トランザクション クライアントまたは上位トランザクション マネージャーは、トランザクションの事前準備/準備/コミット シーケンスを開始できます。

リソース マネージャーがトランザクションの上位エンリストを作成した後、KTM はトランザクションの ZwCommitTransaction へのすべての呼び出しを拒否します。 したがって、トランザクション クライアントはそのようなトランザクションをコミットできません。 代わりに、上位の登録リストを作成したリソース マネージャーは、ZwPrePrepareEnlistmentZwPrepareEnlistment、および ZwCommitEnlistment を呼び出す必要があります。

上位トランザクション マネージャーを作成するタイミング

トランザクション処理システム (TPS) コンポーネントを KTM と統合する場合に、そのコンポーネントに、クライアントが呼び出すことができる独自の非 KTM トランザクション管理機能が含まれているとします。 このような状況では、上位トランザクション マネージャーを作成する必要があります。

たとえば、トランザクションの作成とコミットにクライアントが使用する独自のインターフェイスをコンポーネントが提供しているとします。 コンポーネントのクライアントが KTM を呼び出してトランザクションを作成またはコミットすることはないため、KTM ベースの TPS に統合するときに、コンポーネントが上位トランザクション マネージャーになる必要があります。

上位トランザクション マネージャーを作成する方法

コンポーネントを上位トランザクション マネージャーにする場合は、次の操作を行います。

  1. ZwCreateResourceManager を呼び出して、リソース マネージャーとして登録します。

  2. コンポーネントのクライアントがコンポーネントのクライアント インターフェイスを使用してトランザクションを作成するたびに、ZwCreateTransaction を呼び出します。

  3. ZwCreateEnlistment を呼び出し、ENLISTMENT_SUPERIOR フラグを設定し、ENLISTMENT_SUPERIOR_RIGHTS と ENLISTMENT_SUBORDINATE_RIGHTS の両方のアクセス フラグを指定します。

  4. コンポーネントのクライアントがコンポーネントのクライアント インターフェイスを呼び出してトランザクションをコミットするときには、ZwPrePrepareEnlistmentZwPrepareEnlistment、および ZwCommitEnlistment を呼び出します。

KTM では、上位エンリストがトランザクションごとに 1 つだけ許可されます。 他のリソース マネージャーは、追加のエンリストを作成できます。 これらのエンリストは、コミット操作を開始できないため、下位エンリストと呼ばれます。

上位エンリストをロールバックするためには、上位トランザクション マネージャーが ZwRollbackEnlistment を呼び出 します。

上位エンリストを回復するためには、上位トランザクション マネージャーが ZwRecoverEnlistment を呼び出 します。

上位トランザクション マネージャーがトランザクションをコミット、ロールバック、または回復すると、KTM は、トランザクション通知をすべての下位エンリストに送信します。これにより、下位エンリストが参加できるようになります。

上位トランザクション マネージャーが入った TPS は、単一フェーズ コミット操作を使用できません。

回復操作中に、KTM がトランザクションの結果を判断できない場合は、上位トランザクション マネージャーに TRANSACTION_NOTIFY_RECOVER_QUERY 通知が送信されます。 これに対して、トランザクションをコミットできる場合は、上位のトランザクション マネージャーが ZwCommitEnlistment を呼び出す必要があります。トランザクションをロールバックする必要がある場合は、ZwRollbackEnlistment を呼び出す必要があります。 上位トランザクション マネージャーがトランザクションの結果を特定できない場合は、結果を特定できるまで、TRANSACTION_NOTIFY_RECOVER_QUERY 通知に応答してはなりません。