Share via


Programmierüberlegungen für transaktionsbasiertes NTFS

Eine Beschreibung der verschiedenen Programmierüberlegungen für Transaktions-NTFS finden Sie in den folgenden Abschnitten:

Welche Dateiänderungen werden abgewickelt?

Die meisten Dateiänderungen, z. B. Änderungen an Dateiinhalten, Datenströmen, Analysepunkten, Attributen und dem Dateisystemnamespace, werden abgewickelt. Wenn eine dieser Änderungen an einem transaktionsbasierten Dateihandle vorgenommen wird, wird die Änderung von anderen Transaktionen isoliert, und die Änderung wird rückgängig gemacht, wenn für die Transaktion ein Rollback ausgeführt wird.

Änderungen, die sich nicht auf Dateiinhalte, Metadaten oder den Dateisystemnamespace auswirken, z. B. Änderungen an der Komprimierung oder Defragmentierung, werden nicht durchgeführt. Diese Änderungen sind nicht von anderen Transaktionen isoliert und werden nicht rückgängig gemacht, wenn für die Transaktion ein Rollback ausgeführt wird.

Komprimierung

Der Komprimierungsstatus einer in einer Transaktion geöffneten Datei kann nicht geändert werden.

Erstellen einer Datei oder eines Verzeichnisses

Eine Datei oder ein Verzeichnis, die in einer Transaktion erstellt wird, ist für nichts außerhalb der aktuellen Transaktion sichtbar. Außerhalb dieser Transaktion schlägt jeder Versuch, eine Datei mit demselben Namen zu erstellen, mit dem Fehler ERROR_TRANSACTIONAL_CONFLICT fehl, wodurch der Dateiname effektiv für reserviert wird, wenn die Transaktion Commits ausführt oder ein Rollback ausgeführt wird.

Löschen einer Datei

Eine Datei oder ein Verzeichnis, das durch Aufrufen der DeleteFileTransacted-Funktion gelöscht wird, bleibt für alle externen Reader sichtbar.

Hinweis

Alle transaktionierten Handles für die Datei müssen vor Dem Ende der Transaktion geschlossen werden. Wenn die Handles nicht ordnungsgemäß geschlossen sind, erfolgt das Löschen nicht. Alle geöffneten Handles für die Datei müssen geschlossen werden, bevor sie den Commit ausführen, 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.

Löschen eines Verzeichnisses

Ein Verzeichnis, das durch Aufrufen der RemoveDirectoryTransacted-Funktion gelöscht wird, bleibt für alle externen Reader sichtbar.

Hinweis

Für geöffnete Handles für transaktionente Verzeichnisvorgänge gelten dieselben Einschränkungen wie für Dateien. Weitere Informationen finden Sie unter Löschen einer Datei.

Probleme beim Sperren von Verzeichnissen

Wenn eine Datei in einer Transaktion geändert wird, werden alle Verzeichniskomponenten des Pfads zur Datei als angeheftet bezeichnet , bis die Transaktion endet. Das heißt, das System verhindert, dass Sie sie umbenennen, bis die Transaktion committet oder ein Rollback ausgeführt wird. Ein Versuch, ein Verzeichnis, das ein Vorgänger ist, in eine Datei umzubenennen, die in einer laufenden Transaktion geändert wurde, schlägt mit dem Fehler ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY fehl.

Verzeichnisaufzählung

Der Inhalt eines Verzeichnisses kann geändert werden, während eine Enumeration ausgeführt wird, indem APIs verwendet werden, die enumerieren, z. B. die Funktionen FindFirstFileTransacted und FindNextFile .

Änderungen an einem Verzeichnis außerhalb einer Transaktion sind nicht isoliert von der Transaktion und sofort innerhalb der Transaktion sichtbar. Wenn beispielsweise ein nicht transaktionsbasierter Writer einem Verzeichnis eine Datei hinzufügt, wird die neue Datei sofort in der Transaktion angezeigt, sodass beim Aufrufen der FindFirstFileTransacted - oder FindNextFile-Funktion die neue Datei zurückgegeben wird.

Änderungen, die an einem Verzeichnis in einer Transaktion vorgenommen werden, werden isoliert, bis die Transaktion commits erfolgt. Beispielsweise eine Datei, die im Verzeichnis als Teil der Transaktion erstellt wurde. Ein nicht transaktionsbasierter Leser, der die FindFirstFile - oder FindNextFile-Funktion aufruft, wird die neu erstellte Datei erst angezeigt, wenn der Transaktionscommitten erfolgt.

Speicherabbilddateien

Der Client muss die FlushViewOfFile-Funktion aufrufen, das Dateizuordnungsobjekt schließen und das Dateihandle schließen, bevor er die zugeordnete Transaktion für eine Speicherzuordnungsdatei committen kann.

Benannte Datenströme

Benannte Datenströme sind vollständig transaktional, aber die Sperrung erfolgt auf Dateiebene, nicht auf Streamebene. Autoren von außerhalb einer Transaktion, die versuchen, einen Beliebigen Stream innerhalb einer gesperrten Datei zu ändern, erhalten den Fehler ERROR_SHARING_VIOLATION.

Sie können einen sekundären Stream in einer Transaktion nicht umbenennen.

Umbenennen einer Datei oder eines Verzeichnisses

Um eine Datei als transaktionierten Vorgang umzubenennen, rufen Sie MoveFileTransacted auf, um die Datei zu verschieben.

Reparse Points

Änderungen an Analysepunkten werden durchgeführt. Das bedeutet, dass ein neuer Analysepunkt einer Datei in einer Transaktion nicht sichtbar ist, wenn ein neuer Analysepunkt einer Datei in einer Transaktion zugewiesen wird. Ebenso sind Änderungen oder Das Entfernen eines vorhandenen Analysepunkts erst sichtbar, wenn ein Commit erfolgt.

Fehlercodes

Der Kernel Transaction Manager (KTM) verwendet die Systemfehlercodes im Bereich von 6700 bis 6799. Transaktions-NTFS (TxF) verwendet Windows-Fehlercodes im Bereich von 6800 bis 6899. Weitere Informationen finden Sie unter WinError.h und Systemfehlercodes (6000-8199).

Verschlüsseltes Dateisystem

TxF unterstützt keine Vorgänge für EFS-Dateien. Sie können keine EFS-verschlüsselte Datei für Transaktionen öffnen. Beim Aufrufen der CreateFileTransacted-Funktion für eine EFS-Datei tritt der Fehler ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION auf. Auf ähnliche Weise schlägt das Aufrufen der EncryptFile-Funktion für eine Datei in einer Transaktion mit dem Fehler ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION fehl.

Datei-E/A-Funktionen und Transaktions-NTFS

TxF bietet neue Transaktionsfunktionen, die einen Dateinamen annehmen, und ändert das Verhalten vorhandener Datei-E/A-API-Funktionen, die ein Dateihandle verwenden.

Transacted Functions

Wenn Sie keine der folgenden transaktionenten Funktionen anstelle der nicht transaktionsbasierten Version aufrufen, wird der Vorgang nicht ausgeführt:

Beispielsweise verfügt die CreateFile-Funktion jetzt über eine transaktionsfähige Version: CreateFileTransacted.

Datei-E/A-Funktionen, die von TxF geändert wurden

In der folgenden Tabelle sind die Funktionen aufgeführt, deren Verhalten von Transaktions-NTFS beeinflusst wird. Das Verhalten der ReadFile-Funktion hängt beispielsweise davon ab, ob der hFile-Parameter von der CreateFile-Funktion oder der CreateFileTransacted-Funktion erstellt wurde.

Funktion Beschreibung
Closehandle
Anwendungen sollten alle Handles schließen, die an eine Transaktion gebunden sind, bevor ein Commit für die Transaktion ausgeführt wird. Eine Anwendung muss ein transaktionsfähiges Handle schließen, das mit FILE_FLAG_DELETE_ON_CLOSE geöffnet wurde, bevor ein Commit für die Transaktion ausgeführt wird, damit der Löschvorgang ausgeführt wird.
CreateFileMapping
Wenn hFile eine Transaktion zugeordnet ist, wird das Dateizuordnungsobjekt, das von dieser Funktion erstellt wird, der gleichen Transaktion zugeordnet. Änderungen, die über Ansichten dieses Dateizuordnungsobjekts vorgenommen werden, werden durchgeführt. Anwendungen müssen FlushViewOfFile aufrufen, die Zuordnung aller Ansichten aufheben und alle Handles für das Dateizuordnungsobjekt schließen, bevor sie die transaktionierten Änderungen committen.
FindNextFile
Wenn eine Transaktion an das Dateienumerationshandle gebunden ist, unterliegen die zurückgegebenen Dateien den Transaktionsisolationsregeln.
FSCTL_SET_COMPRESSION
Sie können den Komprimierungsstatus einer Datei, die mit CreateFileTransacted geöffnet wurde, nicht ändern.
GetFileInformationByHandle und GetFileInformationByHandleEx
Wenn eine Transaktion an das Dateihandle gebunden ist, gibt die Funktion Informationen für die isolierte Dateiansicht zurück.
GetFileSize und GetFileSizeEx
Wenn eine Transaktion an das Dateihandle gebunden ist, gibt die Funktion Informationen für die isolierte Dateiansicht zurück.
GetVolumeInformation
Wenn das Volume Dateisystemtransaktionen unterstützt, gibt die Funktion FILE_SUPPORTS_TRANSACTIONS in lpFileSystemFlags zurück.
MapViewOfFile und MapViewOfFileEx
Wenn dem Dateihandle, das zum Erstellen des zugeordneten Dateizuordnungsobjekts verwendet wird, eine Transaktion zugeordnet ist, wird die zugeordnete Ansicht abgewickelt. Wenn die Ansicht verwendet wird, um transaktionierte Änderungen an einer Datei vorzunehmen, muss der Benutzer FlushViewOfFile aufrufen, das Dateizuordnungsobjekt schließen und das Dateihandle schließen, bevor er die zugeordnete Transaktion committen kann.
ReadDirectoryChangesW
Wenn eine Transaktion an das Verzeichnishandle gebunden ist, spiegeln die Benachrichtigungen die isolierte Ansicht des Verzeichnisses wider. Änderungen an Dateien außerhalb der transaktionsierten Ansicht des Verzeichnisses sind nicht in den Benachrichtigungen enthalten.
ReadFile, ReadFileEx und ReadFileScatter
Wenn eine Transaktion an das Dateihandle gebunden ist, gibt die Funktion Daten aus der transaktionsgebundenen Ansicht der Datei zurück. Ein transaktionsiertes Lesehandle zeigt für die Dauer des Handles garantiert dieselbe Ansicht einer Datei an.
SetEndOfFile
Wenn eine Transaktion an das Handle gebunden ist, wird die Änderung der Position am Ende der Datei durchgeführt.
SetFileInformationByHandle
Wenn eine Transaktion an das Handle gebunden ist, werden die vorgenommenen Änderungen für die Informationsklassen FileBasicInfo, FileRenameInfo, FileAllocationInfo, FileEndOfFileInfo und FileDispositionInfo durchgeführt.
SetFileShortName
Wenn eine Transaktion an das Handle gebunden ist, wird die Änderung des Kurznamens der Datei durchgeführt.
SetFileTime
Wenn eine Transaktion an das Handle gebunden ist, wird die Änderung der Dateizeit durchgeführt.
WriteFile, WriteFileEx und WriteFileGather
Wenn eine Transaktion an das Dateihandle gebunden ist, wird der Dateischreibvorgang durchgeführt.