1

自動コミットがすべてのSQLステートメントをコミットすることは知っていますが、データベースへの更新は直接ディスクに送られますか、それともフラッシュされるまでキャッシュに残りますか?

データベースの実装に依存していることを認識しています。

自動コミットとは、a) すべてのステートメントが完全なトランザクションであり、ディスクに直接送信されることを意味しますか、または b) すべてのステートメントが完全なトランザクションであり、後でフラッシュされるキャッシュに送信されるか、ディスクに直接送信されることを意味しますか?

明確化は素晴らしいでしょう。

4

6 に答える 6

4

自動コミットとは、各ステートメントがすぐにコミットされる独自のトランザクション内にあることを意味します。BEGINこれは、トランザクションを明示的に実行し、COMMIT完了したら (通常は複数のステートメントの後で)トランザクションを実行する必要がある「通常」モードとは対照的です。

「自動コミット」というフレーズは、ディスク アクセスやキャッシュとは何の関係もありません。実装の詳細として、ほとんどのデータベースはコミット時にディスクに書き込み、データの損失を回避しますが、これは仕様では必須ではありません。

于 2008-10-17T21:15:41.323 に答える
1

コミットは、何かがディスクに書き込まれたことを保証するものではなく、トランザクションが完了し、変更が他のユーザーに表示されるようになったことのみを保証します。

永続的とは、必ずしもディスクへの書き込み (つまり永続的) を意味するわけではありません...「コミット」がトランザクションの完了を待機する場合でも、一部のデータベースで構成できます。

たとえば、Oracle 10gR2 には、IMMEDIATE、WAIT、BATCH、NOWAIT など、いくつかのコミット モードがあります。BATCH はバッファに変更をキューに入れ、ライターは後で変更をディスクに書き込みます。NOWAIT は、I/O に関係なくすぐに戻ります。

commit の正確な動作はデータベース固有であり、多くの場合、データ損失に対する許容度に応じて構成できます。

于 2008-10-18T00:43:11.997 に答える
1

ARIES ベースのプロトコルの場合、トランザクションのコミットには、そのトランザクション内で行われたすべての変更のログ記録が含まれます。変更はすぐにlogfileにフラッシュされますが、必ずしも datafile にフラッシュされるとは限りません (これは実装に依存します)。これは、障害が発生した場合に変更を確実に復元できるようにするのに十分です。したがって、(b)。

于 2008-10-17T21:16:34.597 に答える
0

データベーストランザクションがACIDであると主張されている場合、D(耐久性)は、コミットされたトランザクションが、コミットが成功した直後にクラッシュ後も存続することを義務付けています。単一サーバーデータベースの場合、それはディスク上にあることを意味します(ディスクコミット)。一部の最新のマルチサーバーデータベースでは、複数のサーバーが同時にクラッシュする可能性があると仮定して、トランザクションが1つ以上のサーバーに送信されることも意味します(ネットワークコミット、通常はディスクよりもはるかに高速です)。ずっと小さい。

于 2008-10-18T07:08:16.993 に答える
0

使用している DBMS によって異なります。たとえば、Firebirdは設定ファイルのオプションとしてそれを持っています。強制書き込みをオンにすると、変更は直接ディスクに書き込まれます。それ以外の場合、それらはファイルシステムに送信され、実際の書き込み時間はオペレーティング システムのキャッシュに依存します。

于 2008-10-17T21:35:06.447 に答える
-1

コミットがアトミックであることを保証することは不可能であるため、最新のデータベースでは 2 フェーズまたは 3 フェーズのコミット戦略が使用されています。アトミックコミットを参照してください

于 2008-10-17T21:19:04.670 に答える