我是编写嵌入式系统应用程序团队的一员。该应用程序经常遭受由电力短缺引起的数据损坏。我认为实施某种交易会阻止这种情况发生。一种情况包括在写入一些额外存储(事务日志)之前复制文件区域。还有什么其他可能性?
答案 0 :(得分:5)
数据库使用各种技术来确保状态得到适当保留。
DBMS通常会保留一个复制的控制文件 - 多个设备上的多个同步副本。两个就够了。更多,如果你是偏执狂。控制文件提供了一些用于定位其他文件及其预期状态的关键参数。控制文件可以包含“数据库版本号”。
每个文件都有多种形式的“版本号”。很多时候它是以简单的形式加上一些XOR补码,这样两个版本号可以通过简单的方式检查以获得正确的关系,并匹配控制文件的版本号。
所有交易都写入交易日记帐。然后将事务日志写入数据库文件。
在写入数据库文件之前,原始数据块将复制到“之前的图像日记”或回滚段或其他类似文件。
当块被写入文件时,序列号会更新,并且该块将从事务日志中删除。
您可以阅读RDBMS技术的可靠性。
答案 1 :(得分:2)
有很多方法可以做到这一点;通常,所需的唯一假设是小写(< 4k)是原子的。例如,以下是CouchDB的用法:
如果程序在写入更新时但在写入标题之前死亡,则会丢弃文件末尾的额外数据。如果在写入标题后失败,则写入完成并且一切正常。由于该文件仅附加,因此这些是唯一的故障情形。这还有一个优点,即提供没有读锁定的多版本并发控制。
当文件增长太长时,只需读出所有“实时”数据并将其写入新文件,然后删除原始数据。
答案 2 :(得分:0)