MVCC制御 - notee/MySQL GitHub Wiki

InnoDBにおけるMVCC(マルチバージョン並行性制御)

InnoDBでは各行が2つの隠れた値を持つ。1つは行が作成されたタイミング、もう1つは行が削除されたタイミングを記録している。このタイミングはインクリメンタルなシステムバージョン番号である。このシステムバージョン番号はトランザクションが開始するたびにインクリメントされる。

InnoDBはこれらの値を用いてMVCCと呼ばれる並行性を高める手法を行っている。

REPEATABLE READの場合の振る舞い

SELECT

作成タイミングがトランザクションのバージョン以下、削除タイミングが未定義かトランザクションのバージョンより大きい行を検索する。 これによってSELECTした行がトランザクション前に存在しており、また他のトランザクションによって変更されていないものであることを担保する。

INSERT

新しい行を作成し、行の作成タイミングをトランザクションのバージョンとする。

DELETE

対象行の削除タイミングをトランザクションのバージョンとする。

UPDATE

対象行のコピーを作成し、値を書き換え、作成タイミングをトランザクションのバージョンとする。また対象行の削除タイミングをトランザクションのバージョンとする。

つまり

このMVCCが処理対象に影響を与えるのはSELECT読み取りである。更新系は対象のバージョンが何であろうと処理が行われる。ロック指定をしないSELECT読み取りに関して、REPEATABLE READではトランザクション開始時に存在していたもののみ読む。