KTM でのログ ストリームの使用

KTM ベースのトランザクション処理システム (TPS) では、共通ログ ファイル システム (CLFS) を使用してトランザクション アクティビティをログに記録する必要があります。 KTM は、各トランザクション マネージャー オブジェクトのログ ストリームを作成します。 各リソース マネージャーは、独自のログ ストリームを作成する必要があります。

トランザクション マネージャー オブジェクトのログ ストリームの作成

リソース マネージャーが ZwCreateTransactionManager を呼び出すときは、CLFS ログ ストリームの名前を指定する必要があります。 指定したストリームが存在しない場合は、KTM によって作成されます。 ストリームが既に存在する場合は、ZwCreateTransactionManager によって再度開きます。 KTM は、トランザクション マネージャー オブジェクトにこのログ ストリームを割り当てます。

KTM では、トランザクション マネージャー オブジェクトのログ ストリームを使用して、トランザクション マネージャー オブジェクトと、トランザクション マネージャー オブジェクトに関連付けられているすべてのリソース マネージャー オブジェクト、トランザクション オブジェクト、および参加オブジェクトに関する内部状態情報を記録します。 トランザクション操作が完了する前に中断された場合、KTM はログ内の情報を使用して、トランザクションをコミットするかロールバックするかを決定できます。

KTM は、リソース マネージャーがクライアントから受信またはクライアントに送信するトランザクション データを記録しません。 リソース マネージャーは、独自のログ ストリームを使用してこの情報を記録する必要があります。

リソース マネージャーは、ZwQueryInformationTransactionManager を呼び出して、ログ ストリームのパス名や KTM がストリームに割り当てる GUID など、トランザクション マネージャー オブジェクトのログ ストリームに関する情報を取得できます。

Resource Manager のログ ストリームの作成

初期化コードでは、各リソース マネージャーが ClfsCreateLogFile を呼び出して独自のログ ストリームを作成する必要があります。 各リソース マネージャーは、そのストリームを使用して、トランザクションのデータのコミット、ロールバック、または復旧に必要なトランザクションに関するすべての情報を記録する必要があります。

KTM と TPS のすべてのリソース マネージャーは 1 つのログ ファイルを使用できますが、各 TPS コンポーネントはログ ファイル内で異なるストリームを使用する必要があります。 ログ ファイル内で個々のストリームを指定する方法については、「ClfsCreateLogFile」を参照してください。

KTM は定期的に、トランザクション マネージャーのログ ストリームに再開領域を作成します。 KTM は、復旧操作を実行すると、最後の再開領域を読み取って、システムがシャットダウンする前に開いていたオブジェクトの状態を復旧します。 同様に、リソース マネージャーは、ログ ストリームに再開領域を定期的に作成する必要があります。 たとえば、リソース マネージャーは、トランザクション操作が完了するたびに再開領域を作成できます。

CLFS ログ・ストリームの再開領域の詳細については、「CLFS ストリームからの再始動レコードの読み取り」を参照してください。 また、ClfsWriteRestartAreaClfsReadRestartArea、および ClfsReadPreviousRestartArea ルーチンも参照してください。

復旧にログ ストリームを使用

リソース マネージャーが ZwCreateTransactionManager を呼び出した後、ZwRecoverTransactionManager を呼び出す必要があります。 ZwRecoverTransactionManager ルーチンは、トランザクション マネージャー オブジェクトのログ ストリームを読み取り、TPS の状態を既知の適切なポイントに復旧します。 リソース マネージャーが最後に読み込まれた後にコンピューターが正常にシャットダウンされた場合、またはシャットダウンされなかった場合、ログ ストリームには最小限の情報が含まれます。 システム クラッシュが発生した場合、ログ ストリームには、すべてのトランザクションを既知の状態に復元するための十分な回復情報が含まれます。

リソース マネージャーは、ZwCreateResourceManager を呼び出した後、ZwRecoverResourceManager を呼び出す必要があります。 ZwRecoverResourceManager ルーチンは、各リソース マネージャーの参加リストに関連付けられているトランザクションの復旧を試みます。 リソース マネージャーのトランザクションを復旧する方法の詳細については、「復旧操作の処理」を参照してください。

トランザクション データの格納

CLFS ログ ストリームを使用するリソース マネージャーは、CLFS マーシャリング領域にトランザクション データを格納する必要があります。 CLFS は、ログ ストリームのマーシャリング領域から永続的なストレージ メディアにデータを定期的に移動します。 データを変更する操作をログに記録するために、リソース マネージャーは次の操作を行う場合があります。

  1. 書き込み操作によって変更される前に、元のデータをマーシャリング領域にコピーします。

  2. データベースの永続ストレージ メディアを変更せずに、データのコピーに対して操作を実行します。

  3. 新しいデータをマーシャリング領域にコピーします。

リソース マネージャーがロールバック通知を受け取った場合は、ログ ストリームから元のデータを復元できます。 コミット通知を受け取った場合、リソース マネージャーは変更されたデータをログ ストリームからデータベースの永続的なストレージ メディアにコピーできます。

リソース マネージャーは、ZwSetInformationEnlistment ルーチンを使用して、復旧情報を参加オブジェクトに格納することもできます。 KTM は、この情報をログ ストリームに保存し、復旧操作中にログ ストリームから読み取ります。 そのため、リソース マネージャーは、ZwQueryInformationEnlistment を呼び出すことによって、いつでもこの復旧情報を取得できます。