2009-11-25 121 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來獲得詳細信息。