伯克利数据库使用的原子性如何?

时间:2009-11-25 04:22:05

标签: atomic database berkeley-db data-integrity

我正在编写一个包含24个哈希项目的简单应用程序,以便在程序执行期间保持一致,因此Berkeley DB(DBM)应该非常适合这项任务。

这只是为了好玩。

但是我想知道是否使用它(使用Ruby),然后当用户按下CTRL-C时,执行就会停止。在这种情况下,数据不能全部搞砸了吗?

例如,如果DB中的值为63,我将其递增1(为64)

63 =  111111 (in binary)  
64 = 1000000 (in binary)

那么,当写出“最高有效”1时,CTRL-C是否会出现,但是0还没有被写入?在这种情况下,DB中的值将是127而不是63或64.如果它不是Ruby而是在C中,并且用户使用“关闭窗口”或“kill”来终止进程,该怎么办?考虑一下,硬盘驱动器可能会同时将这个字节(或4字节)写入硬盘表面,所以这不应该发生。

如果CTRL-C不会导致这种情况发生,那么停电或我自己踢电源插头会导致这种情况发生吗?例如,当值首先缓存在RAM中,并且当它写入硬盘时,我会启动电源插头,硬盘驱动器会在写入0之前断电。我知道一百万次,这不会发生,但这只是一个好奇的问题。

另一方面,如果我的脚本是

  1. 减少硬币值
  2. 在用户名单中为用户提供“汉堡包”
  3. 然后当用户按下CTRL-C,并且它恰好发生在上面的(1)和(2)之间时,那么用户将获得更少的硬币,并且不会获得汉堡包。

    为了防止所有这些发生,使用SleepyCat,SQLite或MySQL的事务方法,这些都不会发生?

1 个答案:

答案 0 :(得分:2)

没有好的数据库系统(包含Berkley DB的类别)可能会以您建议的方式中断,并且值会部分更新。按control-c时,不能中断CPU中指令。中断始终存在一定程度的粒度,编写良好的数据库利用这一事实来防止数据库处于不一致状态。

电源中断时存在数据损坏和丢失的可能性,但数据是否丢失或损坏的详细信息更多地与存储数据库文件的文件系统有关。例如,一个好的日志文件系统会在“日志”中写下它将要执行的操作,然后在日志中写入它所做的事情。因此,例如,如果它在写入操作期间失去了电源,它会查看其日志以查看在允许访问文件系统之前是否需要完成任何操作。这是一种过度简化,但您可以通过查看维基百科上的ext3来获取详细信息。