デフォルトの REPEATABLE READ
分離レベルで起動していると仮定して下さい。一貫した読み取り(通常の
SELECT
ステートメント)では、InnoDB
は、クエリがデータベースを参照する時の基準となるタイムポイントをトランザクションに与えます。こうして、タイムポイントが割り当てられた後に、他のトランザクションが行を削除してコミットしたとしても、一度読み取った内容は変わりません。挿入と更新も同じように扱われます。
割り当てられたタイムポイントを先に進めるには、トランザクションをコミットし、新たな
SELECT
を実行します。
これは、マルチ バージョン並行処理制御 と呼ばれています。
User A User B SET AUTOCOMMIT=0; SET AUTOCOMMIT=0; time | SELECT * FROM t; | empty set | INSERT INTO t VALUES (1, 2); | v SELECT * FROM t; empty set COMMIT; SELECT * FROM t; empty set COMMIT; SELECT * FROM t; --------------------- | 1 | 2 | --------------------- 1 row in set
この例の中では、ユーザ A は、ユーザ A と B の両方が挿入をコミットした時だけ、B によって挿入された行を確認する事ができ、それによってタイムポイントは B のコミットよりも先に進みます。
データベースの 「最新の」
状態を確認したければ、READ
COMMITTED
分離レベルかロック読み取りのどちらかを利用しなければいけません:
SELECT * FROM t LOCK IN SHARE MODE;