デフォルトの REPEATABLE READ
分離レベルで実行しているとします。
一貫した読み取り(このレベルでは、通常の
SELECT
ステートメントは読み取り一貫性がある)
では、クエリがデータベースを参照するときの基準となるタイムポイントを、InnoDB
はトランザクションに割り当てます。こうして、タイムポイントが割り当てられた後に(セッションごとのスナップショットを取った後に)、他のトランザクションがレコードを削除してコミットしたとしても、一度読み取った内容は変わりません(トランザクション中の読み取り内容は同じです)。挿入と更新も同様です。
割り当てられたタイムポイントを先に進めるには、トランザクションをコミットし、新たな
SELECT
を実行します。
これは、マルチバージョン並行処理制御(multi-versioned concurrency control)と呼ばれます。
ユーザ A ユーザ B SET AUTOCOMMIT=0; SET AUTOCOMMIT=0; 時間経過 | 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 | ---------------------
このように、ユーザ B が挿入したレコードをユーザ A が参照できるのは、B が挿入をコミットした後で、A がコミットした後になります。また、A が自分のトランザクションをコミットしたことで、時点が B のコミットより先に進みます。
データベースの ``最新の'' 状態を参照するには、共有ロックを利用した読み取りを使用する必要があります。
SELECT * FROM t LOCK IN SHARE MODE;
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.