2

私はデータベースで耐久性がどのように達成されるかをたくさん研究しました、そして私がよく理解すればそれはこのように機能します(単純化された):

クレントの視点:

  1. トランザクションを開始します。
  2. テーブル値に挿入...
  3. トランザクションのコミット

DBエンジンの観点:

  1. トランザクション開始インジケーターをログファイルに書き込みます
  2. クライアントによって行われた変更をログファイルに書き込みます
  3. トランザクションコミットインジケーターをログファイルに書き込みます
  4. ログファイルをHDDにフラッシュします(これにより、データの耐久性が保証されます)
  5. クライアントに「OK」を返します

私が観察したこと:

クライアントアプリケーションはシングルスレッドアプリケーション(1つのデータベース接続)です。私は400トランザクション/秒を実行できますが、ファイルに何かを書き込んでからこのファイルをHDDにfsyncする簡単なテストでは、150同期/秒しか実行されません。クライアントがマルチスレッド/マルチ接続の場合、DBエンジンがトランザクションをグループ化し、いくつかのトランザクションごとに1つのfsyncを実行すると想像しますが、そうではありません。

私の質問は、たとえばMsSQLが、トランザクションのコミットごとにログファイル(fsync、FlushFileBuffersなど)を実際に同期するのか、それとも他の種類の魔法の背後にあるのかということです。

4

1 に答える 1

0

簡単に言えば、トランザクションが永続的であるためには、データベースへの変更がディスクに書き込まれる前に、ログ ファイルが安定したストレージに書き込まれる必要があります。

安定したストレージは、想像以上に複雑です。たとえば、ディスクは通常、安定したストレージとは見なされません。(とにかく、トランザクション データベース エンジンのコードを書く人によるものではありません。)

特定のオープン ソース dbms が安定したストレージにどのように書き込むかを確認するには、ソース コードを読む必要があります。PostgreSQL のソース コードはオンラインです。(ファイルは xlog.c です) MySQL のソースがわかりません。

于 2011-03-26T12:23:50.357 に答える