次の方法で共有


ILog インターフェイス (txlogpub.h)

汎用の低レベルログ機能を提供します。

共通ログ ファイル システム (CLFS) には、ILog によって提供される のスーパーセットである機能が用意されています。

継承

ILog インターフェイスは、IUnknown インターフェイスから継承されます。 ILog には、次の種類のメンバーもあります。

メソッド

ILog インターフェイスには、これらのメソッドがあります。

 
ILog::AppendRecord

ログの末尾に新しいレコードを書き込みます。
ILog::Force

少なくとも指定された LSN を介して、ログの内容を強制的にディスクに移動します。
ILog::GetLogLimits

ログの現在の境界に関する情報を取得します。
ILog::ReadRecord

ログからレコードを読み取ります。
ILog::ReadRecordPrefix

レコードの最初の部分をログから読み取ります。
ILog::SetAccessPolicyHint

レコードが読み取られるパターンに関するヒントを実装に提供します。
ILog::TruncatePrefix

ログの指定したプレフィックスをスローし、取得できなくなります。

注釈

WAL は、データベース管理システムなどの特定のアプリケーションでアトミックトランザクションと分離トランザクションを実装するために使用される手法です。 この手法では、これらの変更を行う前に、アプリケーションのリソースに対する変更のレコードをログに書き込みます。 これにより、トランザクションが失敗した場合や中断された場合など、必要に応じて変更を元に戻すことができます。 アプリケーションがシステムクラッシュや停電などの中断に対して堅牢なトランザクションを提供するには、ログの実装でログを強制する方法を提供する必要があります。つまり、先に進む前に、以前に書き込まれたレコードがディスク上にあることを確認します。

ILog を使用するレコードの書き込みはシーケンシャル操作です。つまり、新しいレコードは常にログの末尾に追加されます。 ログに追加される各レコードには、後でレコードを取得するために使用できる数値識別子であるログ シーケンス番号 (LSN) が割り当てられます。 データ型 LSN は、 LARGE_INTEGERの typedef であり、符号付き 64 ビット値です。ただし、 ILog では、負でない値を持つ LSN のみが使用されます。 さらに、LSN は次の条件を満たす必要があります。

  • LSN は単調に増加しています。レコード A の後にレコード B がログに書き込まれる場合、レコード B の LSN はレコード A の LSN より大きくなければなりません。
  • 0 と MAXLSN (0x7FFFFFFFFFFFFFFF) の値は、 ILog の一部のメソッドにとって特別な意味を持つので、レコードの LSN として使用しないでください。
ここでの条件以外に、 ILog の実装によって LSN がどのように割り当てられるかについて、想定しないでください。 特に、レコードに LSN のシーケンシャル値が割り当てられると想定しても安全ではありません。

レコードがログに追加された後は、変更されない可能性があります。 ただし、既にコミットされているトランザクションの変更のレコードなど、以前に書き込まれたレコードが不要になった場合、 ILog ではログの切り捨てがサポートされます。 これにより、不要なレコードに使用されたディスク領域を再利用できます。 ログの切り捨ては、指定された値より小さい LSN を持つすべてのレコードを削除することで構成されます。

パフォーマンスの最適化として、 ILog の一部の実装では、ログが強制されるまでメモリ内のレコードをバッファーする場合があります。 このような場合は、特別なエラー制御と回復を検討する必要があります。 次の状況を検討します。

  1. レコード A はログに追加されますが、ログは強制されません。 ILog 実装は、レコードをメモリ内のバッファーにコピーし、成功コードを返します。
  2. レコード B がログに追加され、 ILog 実装によってログが強制的にディスクに追加されます。 これは、呼び出し元が強制的にログを要求したか、メモリ バッファーがいっぱいであるためです。 ただし、たとえばディスク領域が不足しているため、書き込み操作は失敗します。
この状況では、成功コードを返したすべてのレコードが最初にディスクに書き込まれるという保証がない限り、 ILog 実装で追加のレコードをログに追加できるようにするのは不適切です。 エラー制御の考えられる方法の 1 つは、この状況が発生したときにログをエラー状態に固定し、ログ インスタンスへの追加の書き込みを完全に禁止することです。 追加されたレコードごとにログを強制的にディスクに記録しない呼び出し元は、この状況が発生し、適切に処理できることを認識する必要があります。

ILog ファイルベースの実装

Windows オペレーティング システムには ILog のファイル ベースの実装が用意されています。これにより、ファイルの先書きログに適したログを作成できます。 ログは循環バッファーとしてファイルを使用します。これにより、未使用の領域を再利用できます。 これにより、ログがいっぱいになったときに追加のレコードを収めるために必要なファイルのサイズが大きくなる場合もあります。 ログに対する変更はアトミックに行われ、クラッシュ後にログの内容が回復される可能性があります。 この実装では、メモリ内のバッファーを使用してログ レコードを追加します。 その結果、呼び出し元がログの強制を要求しない限り、 ILog::AppendRecord メソッドが戻るときにレコードがディスクに書き込まれるとは限りません。

次の CLSID を使用して、ファイル ベースのログのインスタンスを作成します ( 「CoCreateInstance」を参照してください)。

CLSID_SimpleFileBasedLog ({E16C0593-128F-11D1-97E4-00C04FB9618A} )。

ILog のファイル ベースの実装では、IFileBasedLogInit インターフェイスと IPersistFile インターフェイスもサポートされます。 新しいログ ファイルを作成するには、 IFileBasedLogInit::InitNew を使用します。 既存のログ ファイルを開くには、 IPersistFile::Load を使用します。

この実装では、単純なエラー制御ポリシーを使用します。 ディスクがいっぱいのエラーを含むファイル システム レベルのエラーが原因でいずれかのメソッドが失敗した場合、ログはエラー状態でピン留めされます。 これにより、クライアントがファイルに追加のレコードを追加したり、不適切な可能性のあるレコードを読み取ったりできなくなります。 ログ ファイルを引き続き使用するには、ログの新しいインスタンスを作成する必要があります。

要件

要件
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー txlogpub.h

こちらもご覧ください

IFileBasedLogInit