私はハッシュ内に 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 度、これが起こらないことはわかっていますが、これは単なる好奇心の問題です。
一方、私のスクリプトが
- コインの価値を下げる
- ユーザーのインベントリに「ハンバーガー」を与える
次に、ユーザーが CTRL-C を押すと、上記の (1) と (2) のちょうど中間で発生し、ユーザーはコインを減らし、ハンバーガーを取得しません。
これらすべてが起こらないようにするには、SleepyCat、SQLite、または MySQL を使用したトランザクション メソッドを使用することになりますが、これらのいずれも発生しませんか?