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を参照する。