トランザクション NTFS を使用する方法

Transacted File Handles

トランザクション NTFS (TxF) は、ファイル ハンドルをトランザクションにバインドします。 ハンドル ( ReadFile 関数や WriteFile 関数など) で動作する操作の場合、実際の API 関数呼び出しは変更されません。 名前を取得するファイル操作の場合、これらの操作には明示的なトランザクション関数があります。 たとえば、 CreateFile を呼び出す代わりに、 CreateFileTransacted を呼び出します。 これにより、トランザクションファイルハンドルが作成され、ハンドルを必要とするすべてのファイル操作に使用できます。 このハンドルを使用する後続のすべての操作は、トランザクション操作です。

基本的な TxF 使用法

次の一連の手順は、TxF の最も基本的な使用方法を表します。 アプリケーション デザイナーの判断により、より複雑なシナリオもサポートされます。

  1. KTM 関数 CreateTransaction を呼び出すか、分散トランザクション コーディネーター (DTC) の IKernelTransaction インターフェイスを使用してトランザクションを作成します。
  2. CreateFileTransacted を呼び出して、トランザクションされたファイル ハンドルを取得します。
  3. トランザクション ファイル ハンドルを使用して、必要に応じてファイルを変更します。
  4. 手順 1 で作成したトランザクションに関連付けられているすべてのトランザクション ファイル ハンドルを閉じます。
  5. 対応する KTM または DTC 関数を呼び出して、トランザクションをコミットまたは中止します。

TxF プログラミング モデルの重要なポイント

TxF プログラミング モデルには、TxF アプリケーションを開発するときに考慮すべき次の重要なポイントがあります。

  • トランザクションをコミットまたはロールバックする前に、アプリケーションですべてのトランザクション ファイル ハンドルを閉じることを強くお勧めします。 トランザクションが終了すると、すべてのトランザクション ハンドルが無効になります。 トランザクションの終了後にトランザクション ハンドルに対して実行された close を除くすべての操作は、次のエラーを返します: ERROR_HANDLE_NO_LONGER_VALID
  • ファイルはストレージの単位として表示されます。 部分的な更新と完全なファイルの上書きがサポートされています。 複数のトランザクションで同じファイルを同時に変更することはできません。
  • メモリ マップされた I/O は透過的であり、通常のファイル I/O と一貫性があります。 アプリケーションは、トランザクションをコミットする前に、開いているセクションをフラッシュして閉じる必要があります。 これを行わないと、トランザクション内のマップされたファイルが部分的に変更される可能性があります。 これが行われなかった場合、ロールバックは失敗します。

一般的なプログラミング エラー

トランザクション アプリケーションの開発時に、次の一般的なエラーが発生する可能性があります。

  • トランザクションの完了後にファイル ハンドルを使用する。
  • トランザクションをコミットする前に、削除されたファイルとディレクトリのハンドルを閉じなかったため、削除操作が行われなくなります。 このイベントは、トランザクションの一部と見なされる削除操作のコミットを実行する前に発生する必要があります。 これは、Windows ファイル I/O サブシステムの一部として、操作が処理されない場合でも、最後のハンドルが閉じられるまで、システムはファイルを実際に削除しないためです。
  • システムによって開始されるトランザクションロールバックを考慮に入れることはできません。これはいつでも発生する可能性があります。たとえば、システム リソースが使い果たされた場合、トランザクションはロールバックされます。