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

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. コンポーネントのクライアントがコンポーネントのクライアント インターフェイスを呼び出してトランザクションをコミットするときに、 ZwPrePrepareEnlistmentZwPrepareEnlistmentZwCommitEnlistment を呼び出します。

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

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

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

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

優れたトランザクション マネージャーを含む TPS では、 単一フェーズコミット操作を使用できません。

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