Поделиться через


Рекомендации по программированию для транзакционных NTFS

Описание различных рекомендаций по программированию для Transactional NTFS см. в следующих разделах:

Какие изменения в файле обрабатываются транзакционно

Большинство изменений файлов, таких как изменения содержимого файла, потоки данных, точки повторного анализа, атрибуты и пространство имен файловой системы, контролируются транзакциями. Когда одно из этих изменений выполняется в дескрипторе файла, изменение изолировано от других транзакций, а изменение отменяется, если транзакция откатывается.

Изменения, которые не влияют на содержимое файла, метаданные или пространство имен файловой системы, такие как изменения сжатия или дефрагментации, не выполняются. Эти изменения не изолированы от других транзакций, и они не удаляются при откате транзакции.

Сжатие

Состояние сжатия файла, открытого в транзакции, невозможно изменить.

Создание файла или каталога

Файл или каталог, созданный в транзакции, не отображается для каких-либо внешних текущих транзакций. Вне этой транзакции любая попытка создать файл с тем же именем завершается ошибкой ERROR_TRANSACTIONAL_CONFLICT, таким образом зарезервировав имя файла до завершения или отмены транзакции.

Удаление файла

Файл или каталог, удаленный путем вызова функции DeleteFileTransacted, остается видимым для всех внешних читателей.

Заметка

Все дескрипторы, использующиеся в транзакциях, файла должны быть закрыты до конца транзакции. Если ручки не закрыты должным образом, удаление не происходит. Перед тем как выполнение фиксации для операции удаления будет считаться частью транзакции, все открытые дескрипторы файла должны быть закрыты. Это связано с тем, что система фактически не удаляет файл до закрытия последнего дескриптора, даже если операция не является транзакционной, поскольку это часть подсистемы ввода-вывода файлов Windows.

Удаление каталога

Удаленный каталог путем вызова функции RemoveDirectoryTransacted остается видимым для всех внешних читателей.

Заметка

Те же ограничения применяются к открытым дескрипторам операций с каталогами в транзакционных системах, как и к файлам. Дополнительные сведения см. в разделе Удаление файла.

Проблемы с блокировкой каталога

Если файл изменяется в транзакции, все компоненты каталога пути к файлу называются защищены от переименования до конца транзакции. То есть система предотвращает переименование их до тех пор, пока транзакция не будет зафиксирована или отменена. Попытка переименовать каталог, который является надкаталогом файла, измененного в текущей транзакции, завершится ошибкой ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY.

Перечисление каталогов

Содержимое каталога можно изменить, пока перечисление выполняется в результате использования API, которые перечисляют, например функции FindFirstFileTransacted и FindNextFile.

Изменения каталога за пределами транзакции не изолированы от транзакции и сразу же отображаются в транзакции. Например, если нетранзакционный механизм записи добавляет файл в каталог, новый файл сразу же становится видимым внутри транзакции, так что вызов функции FindFirstFileTransacted или FindNextFile вернет новый файл.

Изменения, внесенные в каталог внутри транзакции, изолированы до фиксации транзакции. Например, файл, созданный в каталоге в рамках транзакции. Читатель без транзакций, вызывающий функции FindFirstFile или FindNextFile, не будет видеть вновь созданный файл до фиксации транзакции.

файлы Memory-Mapped

Клиент должен вызвать функцию FlushViewOfFile, закрыть объект сопоставления файлов и закрыть дескриптор файла перед фиксацией связанной транзакции в сопоставленном с памятью файле.

Именованные потоки

Именованные потоки полностью транзакционные, но блокировка выполняется на уровне файла, а не на уровне потока. Пишущие процессы за пределами транзакции, которые пытаются изменить любой поток в заблокированном файле, получают ошибку ERROR_SHARING_VIOLATION.

Невозможно переименовать вторичный поток в транзакции.

Переименование файла или каталога

Чтобы переименовать файл в виде транзакции, вызовите MoveFileTransacted для перемещения файла.

Точки повторного разбора

Изменения точек повторного анализа трансактируются, что означает, что если новая точка повторного анализа назначается файлу в транзакции, она не видна другим транзакциям. Аналогичным образом, изменения или удаление существующей точки повторной обработки не отображаются до фиксирования.

Коды ошибок

Диспетчер транзакций ядра (KTM) использует системные коды ошибок в диапазоне от 6700 до 6799. Транзакционные NTFS (TxF) используют коды ошибок Windows в диапазоне от 6800 до 6899. Дополнительные сведения см. в статьях WinError.h и системных кодов ошибок (6000-8199).

Зашифрованная файловая система

TxF не поддерживает операции с файлами EFS. Невозможно открыть зашифрованный ФАЙЛ EFS для транзакций. Вызов функции CreateFileTransacted для EFS-файла завершится ошибкой ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION. Аналогичным образом вызов функции EncryptFile в файле в транзакции завершится ошибкой ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION.

Функции ввода-вывода файлов и транзакционная файловая система NTFS

TxF предоставляет новые трансактированные функции, которые принимают имя файла, и изменяет поведение существующих функций API ввода-вывода файлов, которые принимают дескриптор файла.

Трансактированные функции

Если вы не вызываете одну из следующих транзакционных функций вместо её не транзакционной версии, операция не будет выполнена транзакционно.

Например, функция CreateFileтеперь имеет трансактированную версию: CreateFileTransacted.

Функции ввода-вывода файлов, изменённые TxF

В следующей таблице перечислены функции, поведение которых зависит от транзакционных NTFS. Например, поведение функции ReadFile будет зависеть от того, был ли параметр hFile создан функцией CreateFile или функцией CreateFileTransacted.

Функция Описание
CloseHandle
Приложения должны закрывать все дескрипторы, привязанные к транзакции, прежде чем транзакция будет зафиксирована. Приложение должно закрыть транзакционный дескриптор, открытый с использованием FILE_FLAG_DELETE_ON_CLOSE, перед фиксацией транзакции, чтобы операция удаления состоялась.
CreateFileMapping
Если существует транзакция, связанная с hFile, объект сопоставления файлов, который создает эта функция, будет связана с той же транзакцией. Изменения, внесенные с помощью представлений этого объекта сопоставления файлов, обрабатываются транзакционно. Приложения должны вызывать FlushViewOfFile, разблокировать все представления и закрыть все дескрипторы объекта сопоставления файлов перед фиксацией транзакционных изменений.
FindNextFile
Если транзакция привязана к дескриптору перечисления файлов, то возвращенные файлы подвергаются правилам изоляции транзакций.
FSCTL_SET_COMPRESSION
Невозможно изменить состояние сжатия файла, открытого CreateFileTransacted.
GetFileInformationByHandle и GetFileInformationByHandleEx
Если транзакция привязана к дескриптору файла, функция возвращает сведения для изолированного представления файлов.
GetFileSizeиGetFileSizeEx
Если транзакция привязана к дескриптору файла, функция возвращает сведения для изолированного представления файлов.
GetVolumeInformation
Если том поддерживает транзакции файловой системы, функция возвращает FILE_SUPPORTS_TRANSACTIONS в lpFileSystemFlags.
MapViewOfFile и MapViewOfFileEx
Если с дескриптором файла связана транзакция, и он используется для создания объекта отображения файла, который отображается, то соответствующее представление подвергается транзакции. Если представление используется для внесения транзакционных изменений в файл, пользователь должен вызвать FlushViewOfFile, закрыть объект сопоставления файлов и закрыть дескриптор файла перед фиксацией связанной транзакции.
ReadDirectoryChangesW
Если транзакция привязана к дескриптору каталога, уведомления отражают изолированное представление каталога. Изменения файлов за пределами трансактированного представления каталога не включаются в уведомления.
ReadFile, ReadFileExи ReadFileScatter
Если транзакция привязана к дескриптору файла, функция возвращает данные из трансактированного представления файла. Дескриптор чтения с транзакцией гарантирует отображение того же представления файла в течение длительности дескриптора.
SetEndOfFile
Если транзакция привязана к дескриптору, то изменение позиции конца файла выполняется.
SetFileInformationByHandle
Если к дескриптору привязана транзакция, внесенные изменения будут выполняться для классов информации FileBasicInfo, FileRenameInfo, FileAllocationInfo, FileEndOfFileInfoи FileDispositionInfo.
SetFileShortName
Если транзакция привязана к дескриптору, то изменение короткого имени файла выполняется.
SetFileTime
Если транзакция привязана к дескриптору, то изменение времени файла выполняется.
WriteFile, WriteFileExи WriteFileGather
Если транзакция привязана к дескриптору файла, то запись файла выполняется.