私はデータベースで耐久性がどのように達成されるかをたくさん研究しました、そして私がよく理解すればそれはこのように機能します(単純化された):
クレントの視点:
- トランザクションを開始します。
- テーブル値に挿入...
- トランザクションのコミット
DBエンジンの観点:
- トランザクション開始インジケーターをログファイルに書き込みます
- クライアントによって行われた変更をログファイルに書き込みます
- トランザクションコミットインジケーターをログファイルに書き込みます
- ログファイルをHDDにフラッシュします(これにより、データの耐久性が保証されます)
- クライアントに「OK」を返します
私が観察したこと:
クライアントアプリケーションはシングルスレッドアプリケーション(1つのデータベース接続)です。私は400トランザクション/秒を実行できますが、ファイルに何かを書き込んでからこのファイルをHDDにfsyncする簡単なテストでは、150同期/秒しか実行されません。クライアントがマルチスレッド/マルチ接続の場合、DBエンジンがトランザクションをグループ化し、いくつかのトランザクションごとに1つのfsyncを実行すると想像しますが、そうではありません。
私の質問は、たとえばMsSQLが、トランザクションのコミットごとにログファイル(fsync、FlushFileBuffersなど)を実際に同期するのか、それとも他の種類の魔法の背後にあるのかということです。