【えむぶいしーしー】

MVCC(多版型同時実行制御) とは?

💡 過去の自分を残しておけば、読む人と書く人がケンカしない
📌 このページのポイント
MVCC(多版型同時実行制御) 時間 → Ver.1 price = 1000 UPDATE Ver.2 price = 1200 Tx A(読み取り): Ver.1 を参照 Tx B(書き込み): Ver.2 を作成 読み取りはロック不要 → 読み書きが同時にできる!
MVCCのイメージ
ひよこ ひよこ

MVCCってなんだか難しそうな名前だけど、何をする仕組みなの?

ペンギン先生 ペンギン先生

簡単に言うと「データベースで読む人と書く人が同時に作業できるようにする仕組み」だよ。図書館で例えると、本を書き直している最中でも、他の人は書き直す前のコピーを読めるイメージだね

ひよこ ひよこ

ロックしなくていいってこと?

ペンギン先生 ペンギン先生

そうそう。読み取りのときはロックが不要なんだ。データを更新するときに古いバージョンを消さずに残しておいて、読み取り側は自分のトランザクション開始時点のバージョンを見るから、書き込みを待たなくていいよ

ひよこ ひよこ

バージョンを残すってことは、データがどんどん増えちゃわない?

ペンギン先生 ペンギン先生

いいところに気づいたね!その通りで、古いバージョンは不要になったら掃除しないといけないんだ。PostgreSQLだとVACUUMという処理で定期的にお掃除するよ。これをサボると性能がどんどん落ちるんだ

ひよこ ひよこ

PostgreSQL以外でもMVCCは使われてるの?

ペンギン先生 ペンギン先生

MySQLのInnoDB、OracleSQL Serverなど主要なRDBMSはほぼ全部MVCCを採用しているよ。実装方法は少し違って、PostgreSQLテーブル内に古い行を残す方式、MySQLはUndoログに古いバージョンを保存する方式だね

ひよこ ひよこ

どっちの方式がいいの?

ペンギン先生 ペンギン先生

一長一短だよ。PostgreSQL方式はUndoログの管理が不要だけどVACUUMが必要。MySQL方式はVACUUM不要だけどUndoログの肥大化に注意が必要。大量の長時間トランザクションがあるとどちらも古いバージョンが溜まって性能に影響するから、トランザクションは短く保つのが鉄則だね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「MVCC」って出てきたら「データの過去バージョンを残して読み書きを同時にできるようにする仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Multi-Version Concurrency Control」 = 多版型同時実行制御
💬 Multiple Versions(複数バージョン)で Concurrency(同時実行)を Control(制御)するという意味だよ
← 用語集にもどる