Programmierüberlegungen für Transaktions-NTFS
Eine Beschreibung der verschiedenen Überlegungen zur Programmierung von Ntfs für Transaktionen finden Sie in den folgenden Abschnitten:
- Welche Dateiänderungen werden durchgeführt?
- Komprimierung
- Erstellen einer Datei oder eines Verzeichnisses
- Löschen einer Datei
- Löschen eines Verzeichnisses
- Probleme beim Sperren von Verzeichnissen
- Verzeichnisenumeration
- Speicherzuordnungsdateien
- 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 durchgeführt?
Die meisten Dateiänderungen, z. B. Änderungen an Dateiinhalten, Datenströmen, Reparsepunkten, Attributen und dem Dateisystemnamespace, werden durchgeführt. Wenn eine dieser Änderungen an einem Transaktionsdateihandl 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 tritt bei jedem Versuch, eine Datei mit dem gleichen Namen zu erstellen, der Fehler ERROR _ TRANSACTIONAL _ CONFLICT auf. Der Dateiname wird effektiv für den Fall reservieren, dass für die Transaktion ein Commit ausgeführt wird oder ein Rollback ausgeführt wird.
Löschen einer Datei
Eine Datei oder ein Verzeichnis, die durch Aufrufen der DeleteFileTransacted-Funktion gelöscht wird, bleibt für alle externen Leser sichtbar.
Hinweis
Alle transaktiven Handles für die Datei müssen vor dem Ende der Transaktion geschlossen werden. Wenn die Handles nicht ordnungsgemäß geschlossen sind, wird das Löschen nicht ausgeführt. Alle offenen Handles für die Datei müssen geschlossen werden, bevor der Commit ausgeführt wird, damit der Löschvorgang als Teil der Transaktion betrachtet wird. Dies liegt daran, dass das System eine Datei erst dann löscht, wenn das letzte Handle geschlossen wird, selbst wenn der Vorgang nicht im Rahmen des Windows-Datei-E/A-Subsystems durchgeführt wird.
Löschen eines Verzeichnisses
Ein Verzeichnis, das durch Aufrufen der RemoveDirectoryTransacted-Funktion gelöscht wird, bleibt für alle externen Leser sichtbar.
Hinweis
Es gelten die gleichen Einschränkungen für geöffnete Handles bei Transaktionsverzeichnisvorgängen 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 so bezeichnet, dass sie bis zum Ende der Transaktion an die Umbenennung angeheftet werden. Das heißt, das System verhindert, dass Sie sie umbenennen, bis ein Committed oder Rollback für die Transaktion ausgeführt wird. Beim Versuch, ein Verzeichnis, das ein Vorgänger ist, in eine Datei umzubenennen, die in einer laufenden Transaktion geändert wurde, tritt der Fehler _ FEHLER CANT BREAK _ _ TRANSACTIONAL DEPENDENCY _ auf.
Verzeichnisenumeration
Der Inhalt eines Verzeichnisses kann geändert werden, während eine Enumeration in Bearbeitung ist, indem APIs verwendet werden, die aufzählen, z. B. die Funktionen FindFirstFileTransacted und FindNextFile.
Änderungen an einem Verzeichnis außerhalb einer Transaktion sind nicht von der Transaktion isoliert und sofort innerhalb der Transaktion sichtbar. Wenn beispielsweise ein nicht transaktiver Writer einem Verzeichnis eine Datei hinzufügt, ist die neue Datei sofort innerhalb der Transaktion sichtbar, damit der Aufruf der FindFirstFileTransacted- oder FindNextFile-Funktion die neue Datei zurück gibt.
Änderungen, die an einem Verzeichnis innerhalb einer Transaktion vorgenommen werden, werden isoliert, bis für die Transaktion ein Commit ausgeführt wird. Beispielsweise eine Datei, die im Verzeichnis als Teil der Transaktion erstellt wurde. Ein nicht transaktiver Reader, der die Funktion FindFirstFile oder FindNextFile aufruft, sieht die neu erstellte Datei erst, wenn die Transaktion einen Commit ausgeführt hat.
Speicherabbilddateien
Der Client muss die FlushViewOfFile-Funktion aufrufen, das Dateizuordnungsobjekt schließen und das Dateihand handle schließen, bevor die zugeordnete Transaktion für eine Speicherabbilddatei committet wird.
Benannte Datenströme
Benannte Datenströme sind vollständig transaktional, aber das Sperren erfolgt auf Dateiebene, nicht auf Streamebene. Writer von außerhalb einer Transaktion, die versuchen, einen 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 transaktiven Vorgang umzubenennen, rufen Sie MoveFileTransacted auf, um die Datei zu verschieben.
Reparse Points
Änderungen an Reparsepunkten werden durchgeführt. Das bedeutet, dass ein neuer Reparsepunkt, der einer Datei in einer Transaktion zugewiesen wird, für die anderen Transaktionen nicht sichtbar ist. Ebenso sind Änderungen oder das Entfernen eines vorhandenen Reparsepunkts erst nach dem Commit sichtbar.
Fehlercodes
Der KernelTransaktions-Manager (KTM) verwendet die Systemfehlercodes im Bereich von 6700 bis 6799. Transactional 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 FEHLER _ EFS NOT ALLOWED IN _ _ TRANSACTION _ _ auf. Ebenso tritt beim Aufrufen der EncryptFile-Funktion für eine Datei in einer Transaktion der Fehler _ FEHLER EFS NOT ALLOWED _ IN TRANSACTION _ _ _ auf.
Datei-E/A-Funktionen und Transaktions-NTFS
TxF stellt neue transaktive Funktionen bereit, die einen Dateinamen übernehmen, und ändert das Verhalten vorhandener Datei-E/A-API-Funktionen, die ein Dateihandl übernehmen.
Transaktive Funktionen
Wenn Sie keine der folgenden transaktiven Funktionen statt der nicht transaktiven Version aufrufen, wird der Vorgang nicht durchgefü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 transaktive Version: CreateFileTransacted.
Von TxF geänderte Datei-E/A-Funktionen
In der folgenden Tabelle sind die Funktionen aufgeführt, deren Verhalten von Ntfs für Transaktionen beeinflusst wird. Beispielsweise variiert das Verhalten der ReadFile-Funktion abhängig davon, 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 Committed für die Transaktion ausgeführt wird. Eine Anwendung muss ein mit FILE _ FLAG DELETE ON _ _ _ CLOSE geöffnetes transacted-Handle schließen, 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, derselben Transaktion zugeordnet. Änderungen, die über Ansichten dieses Dateizuordnungsobjekts vorgenommen werden, werden durchgeführt. Anwendungen müssen FlushViewOfFileaufrufen, alle Ansichten zuordnen und alle Handles für das Dateizuordnungsobjekt schließen, bevor sie transaktive Änderungen committen. |
| FindNextFile |
Wenn eine Transaktion an das Dateienumeration-Handle gebunden ist, unterliegen die zurückgegebenen Dateien Transaktionsisolationsregeln. |
| FSCTL _ SET _ COMPRESSION |
Sie können den Komprimierungsstatus einer Datei, die von CreateFileTransacted geöffnet wird, nicht ändern. |
| GetFileInformationByHandle und GetFileInformationByHandleEx |
Wenn eine Transaktion an das Dateihand handle gebunden ist, gibt die Funktion Informationen für die isolierte Dateiansicht zurück. |
| GetFileSize und GetFileSizeEx |
Wenn eine Transaktion an das Dateihand handle 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 Dateihandl, das zum Erstellen des zugeordneten Dateizuordnungsobjekts verwendet wird, eine Transaktion zugeordnet ist, wird die zugeordnete Sicht transaktioniert. Wenn die Sicht verwendet wird, um transaktive Änderungen an einer Datei vorzunehmen, muss der Benutzer FlushViewOfFileaufrufen, das Dateizuordnungsobjekt schließen und das Dateihandl schließen, bevor ein Commit für die zugeordnete Transaktion ausgeführt wird. |
| ReadDirectoryChangesW |
Wenn eine Transaktion an das Verzeichnishand handle gebunden ist, spiegeln die Benachrichtigungen die isolierte Ansicht des Verzeichnisses wider. Änderungen an Dateien außerhalb der transaktiven Sicht des Verzeichnisses sind nicht in den Benachrichtigungen enthalten. |
| ReadFile, ReadFileExund ReadFileScatter |
Wenn eine Transaktion an das Dateihandl gebunden ist, gibt die Funktion Daten aus der transaktiven Sicht der Datei zurück. Ein transaktives Lesehandles zeigt für die Dauer des Handles garantiert die gleiche Ansicht einer Datei an. |
| SetEndOfFile |
Wenn eine Transaktion an das Handle gebunden ist, wird die Änderung an der Dateiendeposition 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, WriteFileExund WriteFileGather |
Wenn eine Transaktion an das Dateihandl gebunden ist, wird der Datei-Schreibzugriff durchgeführt. |