3

私はハッシュ内に 24 個の項目を含む単純なアプリを作成して、プログラムの実行間で永続化するため、Berkeley DB (DBM) がこのタスクに適しているはずです。

そして、それはただの楽しみです。

しかし、それを (Ruby で) 使用すると、ユーザーが CTRL-C を押すと、実行が停止するのではないかと思います。この場合、データがすべてめちゃくちゃになることはありませんか?

たとえば、DB の値が 63 の場合、1 ずつ増やします (64 になります)。

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

それで、「最も重要な」1が書き込まれ、0が書き込まれていないときにCTRL-Cが発生する可能性はありますか? その場合、DB の値は 63 または 64 ではなく 127 になります。Ruby ではなく C であり、ユーザーが「ウィンドウを閉じる」または「kill」を使用してプロセスを強制終了した場合はどうなるでしょうか。考えてみると、ハード ドライブはおそらくこのバイト (または 4 バイト) をハード ディスクの表面に一度に書き込むため、これは発生しないはずです。

CTRL-C でこれが起こらない場合、停電や自分で電源プラグを蹴ると、これが起こる可能性がありますか? たとえば、値が最初に RAM にキャッシュされ、それがハードディスクに書き込まれているときに、電源プラグを蹴ると、0 が書き込まれる前にハード ドライブの電源が失われます。100 万回に 1 度、これが起こらないことはわかっていますが、これは単なる好奇心の問題です。

一方、私のスクリプトが

  1. コインの価値を下げる
  2. ユーザーのインベントリに「ハンバーガー」を与える

次に、ユーザーが CTRL-C を押すと、上記の (1) と (2) のちょうど中間で発生し、ユーザーはコインを減らし、ハンバーガーを取得しません。

これらすべてが起こらないようにするには、SleepyCat、SQLite、または MySQL を使用したトランザクション メソッドを使用することになりますが、これらのいずれも発生しませんか?

4

1 に答える 1

2

適切なデータベース システム (Berkley DB を含むカテゴリ) は、値が部分的に更新されて、提案された方法で中断される可能性はありません。control-c を押すと、命令の途中で CPU に割り込むことはできません。中断には常にある程度の粒度があり、適切に作成されたデータベースはその事実を利用して、データベースが一貫性のない状態になるのを防ぎます。

停電時にデータの破損や損失が発生する可能性はありますが、データが失われるか破損するかどうかの詳細は、データベース ファイルが格納されているファイル システムに関係しています。たとえば、優れたジャーナリング ファイルシステムは、これから行うことを「ジャーナル」に書き込み、それを実行してから、実行したことをジャーナルに書き込みます。たとえば、書き込み操作中に電力が失われた場合、ジャーナルを調べて、ファイルシステムへのアクセスを許可する前に完了する必要があるものがあるかどうかを確認します。これは単純化しすぎていますが、詳細については、たとえば wikipedia で ext3 をチェックしてください。

于 2009-11-25T05:38:53.737 に答える