次の方法で共有


カーネル トランザクション マネージャー (KTM) でのログ ストリームの使用

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

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

When your resource manager calls ZwCreateTransactionManager, you must specify the name of a CLFS log stream. 指定したストリームが存在しない場合は、KTM によって作成されます。 If the stream already exists, ZwCreateTransactionManager reopens it. KTM は、トランザクション マネージャー オブジェクトにこのログ ストリームを割り当てます。

KTM では、トランザクション マネージャー オブジェクトのログ ストリームを使用して、トランザクション マネージャー オブジェクトとそのオブジェクトに関連付けられている次のオブジェクトに関する内部状態情報を記録します。

  • 関連付けられているすべてのリソース マネージャー オブジェクト
  • 関連付けられているすべてのトランザクション オブジェクト
  • 関連付けられているすべての参加オブジェクト

トランザクション操作が完了する前に中断された場合、KTM はログ内の情報を使用して、トランザクションをコミットするかロールバックするかを決定できます。

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

Resource managers can call ZwQueryInformationTransactionManager to get information about a transaction manager object's log stream, such as the log stream's path name or the GUID that KTM assigns to the stream.

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

In its initialization code, each resource manager should call ClfsCreateLogFile to create its own log stream. 各リソース マネージャーは、そのストリームを使用して、トランザクションのデータのコミット、ロールバック、または回復に必要なトランザクションに関するすべての情報を記録する必要があります。

KTM と TPS のすべてのリソース マネージャーは 1 つのログ ファイルを使用できますが、各 TPS コンポーネントはログ ファイル内で異なるストリームを使用する必要があります。 For information about how to specify individual streams within a log file, see ClfsCreateLogFile.

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

CLFS ログ・ストリームの再始動域の詳細については、 CLFS ストリームからの再始動レコードの読み取りを参照してください。 Also, see the ClfsWriteRestartArea, ClfsReadRestartArea, and ClfsReadPreviousRestartArea routines.

回復にログ ストリームを使用する

After your resource manager calls ZwCreateTransactionManager, it must call ZwRecoverTransactionManager. The ZwRecoverTransactionManager routine reads the transaction manager object's log stream to recover the state of the TPS to a known good point. コンピューターが正常にシャットダウン (またはシャットダウンしない) 場合、ログ ストリームには、リソース マネージャーが最後に読み込まれた後の最小限の情報が含まれます。 システムのクラッシュが発生した場合、ログ ストリームには、すべてのトランザクションを既知の状態に復元するための十分な回復情報が含まれます。

After your resource manager calls ZwCreateResourceManager, it must call ZwRecoverResourceManager. The ZwRecoverResourceManager routine tries to recover the transactions that are associated with each of the resource manager's enlistments. リソース マネージャーのトランザクションを回復する方法の詳細については、「 回復操作の処理」を参照してください。

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

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

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

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

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

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

Resource managers can also use the ZwSetInformationEnlistment routine to store recovery information in an enlistment object. KTM は、この情報をログ ストリームに保存し、回復操作中にログ ストリームから読み取ります。 Therefore, a resource manager can obtain this recovery information at any time by calling ZwQueryInformationEnlistment.