一貫した読み取りとは、InnoDB
がそのマルチ
バージョニング機能を使用して、ある時点でのデータベースのスナップショットをクエリに提示する事を意味します。クエリには、その時点より前にコミットされたトランザクションによる変更のみが示され、その時点より後のトランザクションまたはコミットされていないトランザクションによる変更は示されません。例外として、クエリを発行したトランザクション自体による変更はクエリに示されます。
このルールに対する例外によって次のような事が起こると覚えておいてください:テーブル内のいくつかの行を更新すると、SELECT
は他の行の古いバージョンを確認すると同時に、更新された行の最新のバージョンを確認します。もし別のユーザが同時に同じテーブルを更新すると、今までとは違う状態のテーブルをデータベース内で確認するかもしれないいう例外があるかもしれません。
デフォルトの REPEATABLE READ
分離レベルで起動しているなら、同じトランザクション内の全ての一貫した読み取りは、そのトランザクション内の最初の読み取りで確立されたスナップショットを読み取ります。
現在のトランザクションをコミットしその後新しいクエリを発行する事で、クエリにより新鮮なスナップショットを得る事ができます。
InnoDB
が READ COMMITTED
と REPEATABLE READ
分離レベル内で
SELECT
ステートメントを処理する中で、一貫した読み取りはデフォルトのモードです。一貫した読み取りはそれがアクセスするテーブル上に一切ロックを設定しないので、別のユーザは、そのテーブル上で一貫した読み取りが行われているのと同時にそれらのテーブルを自由に変更する事ができます。
一貫した読み取りは DROP TABLE
と
ALTER TABLE
全体には機能しない事に注意してください。MySQL
がドロップされたテーブルを利用する事ができず、InnoDB
がそのテーブルを破壊する為、一貫した読み取りは
DROP TABLE
全体には機能しません。ALTER TABLE
は元テーブルのテンポラリ
コピーを作成し、それができた時に元テーブルを破壊する事で機能する為、一貫した読み取りは
ALTER TABLE
全体には機能しません。トランザクション内で一貫した読み取りを再発行する時、新しいテーブル内の行はトランザクションのスナップショットが撮られた時に存在していなかった為に見る事ができません。