如何使用事务性 NTFS
事务处理的文件句柄
事务 NTFS (TxF) 将文件句柄绑定到事务。 对于处理句柄 (的操作(例如 ReadFile 和 WriteFile 函数) ),实际的 API 函数调用不会更改。 对于采用名称的文件操作,这些操作有显式事务处理函数。 例如,调用 CreateFileTransacted,而不是调用 CreateFile。 这会创建事务处理的文件句柄,然后可用于需要句柄的所有文件操作。 使用此句柄的所有后续操作都是事务处理操作。
基本 TxF 用法
以下一系列步骤表示 TxF 的最基本用法。 还支持更复杂的方案,由应用程序设计器决定。
- 通过调用 KTM 函数 CreateTransaction 或使用分布式事务处理协调器的IKernelTransaction 接口 (DTC) 来创建事务。
- 通过调用 CreateFileTransacted 获取事务处理文件句柄 () 。
- 根据需要使用事务处理的文件句柄 () 修改文件 () 。
- 关闭与步骤 1 中创建的事务关联的所有事务处理的文件句柄。
- 通过调用相应的 KTM 或 DTC 函数提交或中止事务。
TxF 编程模型的要点
开发 TxF 应用程序时,TxF 编程模型具有以下要点供你考虑:
- 强烈建议应用程序在提交或回滚事务之前关闭所有事务处理的文件句柄。 事务结束时,系统会使所有事务处理句柄失效。 事务结束后对事务处理句柄执行的任何操作(关闭除外)都返回以下错误: ERROR_HANDLE_NO_LONGER_VALID。
- 文件被视为存储单元。 系统支持部分更新和完整文件覆盖。 多个事务无法同时修改同一文件。
- 内存映射 I/O 是透明的,并且与常规文件 I/O 保持一致。 在提交事务之前,应用程序必须刷新并关闭打开的节。 如果不这样做,可能会导致对事务中的映射文件进行部分更改。 如果未执行此操作,则回滚将失败。
常见编程错误
开发事务处理的应用程序时,可能会出现以下常见错误:
- 事务完成后使用文件句柄。
- 在提交事务之前未能关闭已删除文件和目录的句柄,这将阻止删除操作的发生。 在执行提交之前,必须发生此事件,才能将删除操作视为事务的一部分。 这是因为,在关闭文件的最后一个句柄之前,系统不会实际删除文件,即使未将操作作为 Windows 文件 I/O 子系统的一部分进行事务处理也是如此。
- 无法考虑系统启动的事务回滚,这随时可能发生;例如,如果系统资源耗尽,则会回滚事务。