我需要实现一些对辅助存储的原子写入。我怎么能证明这是愚蠢的?
如果我使用file.open打开C#文件句柄,我将收到一个句柄。我可以给它写一些数据。刷新它并关闭它。但我仍然有一些问题。我想下面的说法是真的?
-
数据可能不会写入磁盘,而是存在于Windows磁盘缓存中
-
数据可能不会写入磁盘,而是存在于HDD缓存中
这将导致以下问题:
-
停电将使我所做的文件中的编辑恢复(在像NTFS这样的事务性FS上)
-
内核死机将使我所做的文件中的编辑恢复(在像NTFS这样的事务性FS上)
我的假设正确吗?如果是这样的话,我该如何对磁盘进行防傻写入?我对NoSQL进行了一点研究,并一直在想,可能有一个NoSQL服务器可以与更靠近硬件的系统进行通信,并且在能够保证字节写入磁盘之前不会将软件返回给我。
欢迎所有想法和想法
Jens
[编辑]在确定所有更改都写入物理磁盘之前,我可能需要等待一段特定的时间?
使操作完全"防傻"的唯一方法是排队、运行操作并确认。事情保持在队列中,可以再次运行,直到确认,或者如果确认是否定的,则可以"回滚"。
假设你不涉及网络(一切都是本地的),你谈论的时间窗口非常小。尽管如此,如果你想确保事情顺利进行,你还是要排队。MSMQ是一个选项。如果数据来自SQL Server,您可以考虑它的排队机制Service Broker(不建议这样做,但这是一种方式)。
最终,这里的想法很像握手,在大多数服务器到服务器的通信中都使用握手。每个人都同意,在双方都放弃自己的工作之前,事情就已经完成了。
我不是Windows内部的专家,但我相信你是对的。我没有对它进行详细的测试,但能够使用MSMQ作为一个非常可靠的存储数据的地方,使用另一个进程来监控队列以进行最终处理。