我有一个数据文件,我不时需要写一个文件的变化。 改变包括改变多个地方的信息。 例如,改变文件末尾的一些数据,并在开始时改变一些信息。 我希望这两个单独的写入既可以成功也可以同时失败,否则它将处于不确定状态并且被有效地破坏。 在.NET或一般情况下是否有这种情况的内build支持?
如果不是那么如何别人解决这个问题? Windows上的数据库如何解决这个问题?
更新 :我不想使用Transactional NTFSfunction,因为它不适用于较旧版本的Windows(如XP),并且在上面描述的文件覆盖scheme中速度较慢。
如果您使用的是Windows 6或更高版本(Vista / 7/2008 / 2008R2),则NTFS文件系统支持事务(包括分布式事务中):但是您将需要使用P / Invoke来调用Win32 API(请参阅此问题 )。
如果您需要在旧版Windows或非NTFS分区上运行,则需要自行执行这些事务。 这绝对是非常重要的:在处理多个进程(包括通过共享进行远程访问)时,即使假设只使用您的访问方法,也会在进程和系统崩溃时获得完整的ACID功能(当然还有一些使用普通Win32 API的进程打破事情)。
在这种情况下,数据库几乎肯定会更容易:有许多进程内数据库(SQL Compact Edition,SQL Lite,…),因此数据库不需要服务器进程。
数据库基本上使用一个杂志的概念(至少那些我知道)。 一个想法是,一个写操作是写在日记,直到Writer
不提交交易。 (当然这只是基本的描述,非常简单)
在你的情况下,它可能是你的文件的副本,你要写一个数据, 如果一切顺利 ,用原来的文件替换原来的文件。
替换是:重命名原始文件,如old
,重命名备份文件,如original
。
如果替换失败:这是一个严重的错误,应用程序应该通过容错策略来处理。 可能是因为它通知用户一个失败的保存操作,并试图恢复。 顺便说一下,你有两个副本的文件。 写操作刚开始的那一个,写操作完成的那一个。
我们在VS IDE上的过去的项目中使用的这种技术,如工业控制系统,相当成功。