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?
- Komprimierung
- Erstellen einer Datei oder eines Verzeichnisses
- Löschen einer Datei
- Löschen eines Verzeichnisses
- Probleme beim Sperren von Verzeichnissen
- Verzeichnisaufzählung
- Speicherabbilddateien
- Benannte Datenströme
- Umbenennen einer Datei oder eines Verzeichnisses
- Reparse Points
- Fehlercodes
- Verschlüsseltes Dateisystem
- Datei-E/A-Funktionen und Transaktions-NTFS
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:
- CopyFileTransacted
- CreateDirectoryTransacted
- CreateFileTransacted
- CreateHardLinkTransacted
- CreateSymbolicLinkTransacted
- DeleteFileTransacted
- FindFirstFileNameTransactedW
- FindFirstFileTransacted
- FindFirstStreamTransactedW
- GetCompressedFileSizeTransacted
- GetFileAttributesTransacted
- GetFullPathNameTransacted
- GetLongPathNameTransacted
- MoveFileTransacted
- RemoveDirectoryTransacted
- SetFileAttributesTransacted
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. |