Использование NTFS с поддержкой транзакций
Транзакционные дескрипторы файлов
Транзакционный NTFS (TxF) привязывает дескриптор файла к транзакции. Для операций, работающих с дескриптором (например, ReadFile и WriteFile), фактический вызов функции API не изменяется. Для операций с файлами, которые принимают имя, для этих операций существуют явные трансактированные функции. Например, вместо вызова CreateFileвызов CreateFileTransacted. При этом создается дескриптор транзакционного файла, который затем можно использовать для всех операций с файлами, требующих дескриптора. Все последующие операции, использующие этот дескриптор, выполняются как транзакционные операции.
Базовое использование TxF
Следующий ряд шагов представляет собой наиболее базовое использование TxF. Более сложные сценарии также поддерживаются по усмотрению конструктора приложений.
- Создайте транзакцию, вызвав функцию KTM CreateTransaction или используя интерфейс IKernelTransaction (DTC) координатора распределенных транзакций .
- Получите дескриптор(ы) транзакционного файла, вызвав CreateFileTransacted.
- Измените файл(ы) по мере необходимости, используя обработанные дескрипторы файла(ов).
- Закройте все дескрипторы файловых операций, связанные с транзакцией, созданной на первом шаге.
- Завершите или прервите транзакцию, вызвав соответствующую функцию KTM или DTC.
Ключевые моменты модели программирования TxF
Модель программирования TxF имеет следующие ключевые моменты, которые необходимо учитывать при разработке приложения TxF:
- Настоятельно рекомендуется закрыть все дескрипторы транзакционных файлов приложения перед фиксацией или откатом транзакции. Система аннулирует все дескрипторы операций, когда транзакция заканчивается. Любая операция, кроме закрытия, выполненная на дескрипторе транзакции после её завершения, возвращает следующую ошибку: ERROR_HANDLE_NO_LONGER_VALID.
- Файл рассматривается как единица хранилища. Поддерживаются частичные обновления и полные перезаписи файлов. Несколько транзакций не могут одновременно изменять один и тот же файл.
- Ввод-вывод через отображение памяти является незаметным и согласованным с обычными операциями ввода-вывода. Приложение должно очистить и закрыть открытый раздел перед фиксацией транзакции. Отсутствие выполнения этого может привести к частичным изменениям сопоставленного файла в рамках транзакции. Произойдет сбой отката, если это не будет сделано.
Распространенные ошибки программирования
При разработке транзакционных приложений могут возникать следующие распространенные ошибки:
- Использование дескриптора файла после завершения транзакции.
- Не закрываются дескрипторы удалённых файлов и каталогов перед закрытием транзакции, что помешает выполнению операций удаления. Для того чтобы операция удаления считалась частью транзакции, это событие должно произойти перед выполнением фиксации. Это связано с тем, что система фактически не удаляет файл до закрытия последнего дескриптора, даже когда операция не транзакционная, как часть подсистемы ввода-вывода файлов Windows.
- Не удалось учесть откаты транзакций, инициированных системой, что может произойти в любое время; Например, транзакция откатывается, если системные ресурсы исчерпаны.