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


Использование транзакционной 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.
  • Не учитывать откаты транзакций, инициированные системой, которые могут произойти в любое время; Например, при исчерпании системных ресурсов выполняется откат транзакции.