2009-11-25 93 views
3

我正在编写一个简单的应用程序,其中包含24个项目,以便在程序执行过程中保持不变,因此Berkeley DB(DBM)应该非常适合完成此任务。Berkeley DB的用法如何?

它只是为了好玩。

但我不知道是否使用它(与Ruby),然后当用户按下CTRL-C,然后停止执行。在这种情况下,数据无法全部搞乱?

例如,如果在DB中的值是63,并且我递增1它(是64)

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

所以,可以在CTRL-C发生右当“最高有效” 1是书面,但0没有被写入?在这种情况下,DB中的值将是127而不是63或64.如果它不是Ruby而是C中,并且用户使用“关闭窗口”或“杀死”来终止进程呢?想想看,硬盘驱动器可能会立即将此字节(或4字节)写入硬盘表面,所以这不应该发生。

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

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

  1. 递减硬币值
  2. 给用户一个“汉堡包”,在他的库存

那么当用户按下CTRL- C,它发生在上面(1)和(2)之间,那么用户将会有更少的硬币,并且不会有汉堡包。

为了防止所有这些事情发生,应该使用使用SleepyCat,SQLite或MySQL的交易方法,而这些都不会发生?

回答

2

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

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