bigmac-jp blog

web開発関連のメモ

MySQL メモ5 MVCC

MySQL InnoDBではMVCCと呼ばれる技術がつかわれている。

MultiVersion Concurrency Control - Wikipedia


複数のユーザ(トランザクション)が並行して処理した場合に、処理の同時並行を失うことなく、データに整合性を保証する仕組みとなっている。

https://dev.mysql.com/doc/refman/5.6/ja/innodb-multi-versioning.html

MVCCの仕組み

更新されたレコード情報をバージョン管理することで、各トランザクションが参照するべきレコード情報保持する。
バージョン情報

ロールバックセグメントと呼ばれる、下記の情報にてバージョン管理がされる。下記の3つはレコード単位で作成される。

DB_ROW_ID レコードを登録したトランザクションIDが登録される。
DB_TRX_ID 最後にレコードを更新したトランザクションIDが登録される。
DB_ROLL_PTR レコードの過去の値を持つundo log recordへのポインタ

トランザクションID(数値)は、トランザクション開始後の最初のSQLが実行されたタイミングで割当がされる。
トランザクションIDをレコードのDB_TRX_IDを比較して、参照する情報を制御する。

自トランID > DB_TRX_ID の場合はそのレコードは他のトランザクションによって更新がかかっていることが判断できる。
その場合は参照する情報は更新前のレコード情報なので、DB_ROLL_PTRをもとにundo log recordを参照する。