事务性 NTFS - 等待 CommitTransaction
Transactional NTFS - wait for CommitTransaction
我正在使用 Transactional NTFS 来原子化对多个文件的多次写入。
问题是提交后,我可能无法重新打开文件,
可能是因为比赛条件。
事件的顺序是:
- NTFS 事务是用
CreateTransaction
创建的
- 文件用
CreateFileTransacted
打开
- 已完成对文件的写入
- 文件关闭
CloseHandle
- 交易已提交
CommitTransaction
- read/write
CreateFile
重新打开文件
最后一步有时会失败,错误代码为 3:
ERROR_PATH_NOT_FOUND - 系统找不到指定的路径。
重新执行程序时,文件就找到了。
这种情况很少发生,但以完全随机的方式发生,这意味着并不总是
重新打开同一文件时。
我的理论是,如果 Windows 终止交易需要很长时间
时间,文件无法以 read/write 模式打开,直到
交易终止。然后我的程序在尝试打开时失败
我自己的文件处于非事务模式。
我认为为了避免这个问题,我需要等待交易
在重新打开文件之前完成。
但是,我还没有找到任何记录在案的方法。
没有聪明的答案,所以我不得不实现自己的虚拟答案:
如果打开刚刚关闭的文件时出现 I/O 错误,
解决方案是在两次调用之间循环打开几次
Sleep() 以释放 CPU,然后确定发生了灾难性错误。
虚拟解决方案,但它解决了问题。
我正在使用 Transactional NTFS 来原子化对多个文件的多次写入。 问题是提交后,我可能无法重新打开文件, 可能是因为比赛条件。
事件的顺序是:
- NTFS 事务是用
CreateTransaction
创建的
- 文件用
CreateFileTransacted
打开
- 已完成对文件的写入
- 文件关闭
CloseHandle
- 交易已提交
CommitTransaction
- read/write
CreateFile
重新打开文件
最后一步有时会失败,错误代码为 3: ERROR_PATH_NOT_FOUND - 系统找不到指定的路径。 重新执行程序时,文件就找到了。 这种情况很少发生,但以完全随机的方式发生,这意味着并不总是 重新打开同一文件时。
我的理论是,如果 Windows 终止交易需要很长时间 时间,文件无法以 read/write 模式打开,直到 交易终止。然后我的程序在尝试打开时失败 我自己的文件处于非事务模式。
我认为为了避免这个问题,我需要等待交易 在重新打开文件之前完成。 但是,我还没有找到任何记录在案的方法。
没有聪明的答案,所以我不得不实现自己的虚拟答案:
如果打开刚刚关闭的文件时出现 I/O 错误, 解决方案是在两次调用之间循环打开几次 Sleep() 以释放 CPU,然后确定发生了灾难性错误。
虚拟解决方案,但它解决了问题。