トランザクション NTFS の使用方法

トランザクション ファイル ハンドル

トランザクション 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 サブシステムの一部として、操作がトランザクションされていない場合でも、最後のハンドルが閉じられるまで、システムはファイルを実際に削除しないためです。
  • システムによって開始されたトランザクションロールバックを考慮に入れなかった。これはいつでも発生する可能性があります。たとえば、システム リソースが使い果たされた場合、トランザクションはロールバックされます。