Verwenden von transaktionsbasiertem NTFS
Transacted File Handles
Transactional NTFS (TxF) bindet ein Dateihandle an eine Transaktion. Bei Vorgängen, die für ein Handle funktionieren (z. B. die Funktionen ReadFile und WriteFile ), wird der tatsächliche API-Funktionsaufruf nicht geändert. Für Dateivorgänge, die einen Namen annehmen, gibt es explizite Transaktionsfunktionen für diese Vorgänge. Rufen Sie beispielsweise CreateFileTransacted auf, anstatt CreateFile aufzurufen. Dadurch wird ein Transaktionsdateihandle erstellt, das dann für alle Dateivorgänge verwendet werden kann, die ein Handle erfordern. Alle nachfolgenden Vorgänge, die dieses Handle verwenden, sind Transaktionen.
Grundlegende TxF-Nutzung
Die folgenden Schritte stellen die grundlegendste Verwendung für TxF dar. Auch komplexere Szenarien werden nach Eigenem Ermessen des Anwendungsdesigners unterstützt.
- Erstellen Sie eine Transaktion, indem Sie die KTM-Funktion CreateTransaction aufrufen oder die IKernelTransaction-Schnittstelle des Distributed Transaction Coordinator (DTC) verwenden.
- Rufen Sie transaktionsierte Dateihandles ab, indem Sie CreateFileTransacted aufrufen.
- Ändern Sie die Datei(en) nach Bedarf mithilfe der transaktionsierten Dateihandles(n).
- Schließen Sie alle transaktionenten Dateihandles, die der in Schritt 1 erstellten Transaktion zugeordnet sind.
- Committen oder Abbrechen der Transaktion durch Aufrufen der entsprechenden KTM- oder DTC-Funktion.
Wichtige Punkte des TxF-Programmiermodells
Das TxF-Programmiermodell enthält die folgenden wichtigen Punkte, die Sie beim Entwickeln einer TxF-Anwendung berücksichtigen sollten:
- Es wird dringend empfohlen, dass eine Anwendung alle transaktionierten Dateihandles schließt, bevor ein Commit oder ein Rollback einer Transaktion erfolgt. Das System ungültigt alle transaktionenten Handles, wenn eine Transaktion endet. Jeder Vorgang mit Ausnahme des Schließens, der nach Abschluss der Transaktion für ein transaktionsiertes Handle ausgeführt wird, gibt den folgenden Fehler zurück: ERROR_HANDLE_NO_LONGER_VALID.
- Eine Datei wird als Speichereinheit betrachtet. Partielle Updates und vollständige Dateiüberschreibungen werden unterstützt. Mehrere Transaktionen können dieselbe Datei nicht gleichzeitig ändern.
- Speicherzuordnungen sind transparent und konsistent mit den regulären Datei-E/A-Vorgängen. Eine Anwendung muss einen geöffneten Abschnitt leeren und schließen, bevor eine Transaktion committ wird. Wenn dies nicht geschieht, kann dies zu teilweisen Änderungen an der zugeordneten Datei innerhalb der Transaktion führen. Ein Rollback schlägt fehl, wenn dies nicht erfolgt.
Häufige Programmierfehler
Die folgenden häufigen Fehler können beim Entwickeln von transaktionenten Anwendungen auftreten:
- Verwenden eines Dateihandles nach Abschluss einer Transaktion.
- Fehler beim Schließen von Handles für gelöschte Dateien und Verzeichnisse vor dem Commit für eine Transaktion, wodurch verhindert wird, dass Löschvorgänge ausgeführt werden. Dieses Ereignis muss vor dem Ausführen des Commits auftreten, damit der Löschvorgang als Teil der Transaktion betrachtet wird. Dies liegt daran, dass das System eine Datei erst löscht, wenn das letzte Handle für sie geschlossen ist, selbst wenn der Vorgang nicht als Teil des Windows-Datei-E/A-Subsystems ausgeführt wird.
- Fehler bei der Berücksichtigung systeminitiierter Transaktionsrollbacks, die jederzeit auftreten können; Beispielsweise wird für eine Transaktion ein Rollback ausgeführt, wenn die Systemressourcen erschöpft sind.