Использование транзакционной NTFS

Дескрипторы файлов с транзакциями

Транзакционная NTFS (TxF) привязывает дескриптор файла к транзакции. Для операций, работающих с дескриптором (например, функций ReadFile и WriteFile ), фактический вызов функции API не изменяется. Для операций с файлами, которые принимают имя, для этих операций существуют явные функции транзакций. Например, вместо вызова CreateFileвызовите CreateFileTransacted. При этом создается дескриптор транзакционного файла, который затем можно использовать для всех операций с файлами, требующих дескриптора. Все последующие операции, использующие этот дескриптор, являются транзакциями.

Базовое использование TxF

Следующая серия шагов представляет собой наиболее базовое использование TxF. Кроме того, поддерживаются более сложные сценарии по усмотрению конструктора приложений.

  1. Создайте транзакцию, вызвав функцию KTM CreateTransaction или используя интерфейс IKernelTransactionкоординатора распределенных транзакций (DTC).
  2. Получение дескрипторов транзакций файлов путем вызова CreateFileTransacted.
  3. При необходимости измените файлы с помощью дескрипторов транзакций.
  4. Закройте все дескрипторы транзакций, связанные с транзакцией, созданной на шаге 1.
  5. Зафиксируйте или прервайте транзакцию, вызвав соответствующую функцию KTM или DTC.

Ключевые моменты модели программирования TxF

Модель программирования TxF имеет следующие ключевые моменты, которые следует учитывать при разработке приложения TxF:

  • Настоятельно рекомендуется, чтобы приложение закрыло все дескрипторы транзакций перед фиксацией или откатом транзакции. Система делает недействительными все дескрипторы транзакций при завершении транзакции. Любая операция, за исключением закрытия, выполненная на транзакционный дескриптор после завершения транзакции, возвращает следующую ошибку: ERROR_HANDLE_NO_LONGER_VALID.
  • Файл рассматривается как единица хранения. Поддерживаются частичные обновления и полные перезаписи файлов. Несколько транзакций не могут одновременно изменять один и тот же файл.
  • Память, сопоставленная с вводом-выводом, является прозрачной и согласована с обычными файлами ввода-вывода. Перед фиксацией транзакции приложение должно очистить и закрыть открытый раздел. Сбой этого может привести к частичным изменениям сопоставленного файла в транзакции. Если это не сделано, происходит сбой отката.

Распространенные ошибки программирования

При разработке транзакций могут возникать следующие распространенные ошибки:

  • Использование дескриптора файла после завершения транзакции.
  • Сбой закрытия дескрипторов удаленных файлов и каталогов перед фиксацией транзакции, что предотвратит выполнение операций удаления. Это событие должно произойти перед выполнением фиксации операции удаления, которое будет считаться частью транзакции. Это связано с тем, что система фактически не удаляет файл до закрытия последнего дескриптора, даже если операция не выполняется, как часть подсистемы ввода-вывода Windows файлов.
  • Не удается учесть откаты транзакций, инициированных системой, что может произойти в любое время; Например, транзакция откатывается, если системные ресурсы исчерпаны.