【えむぶいしーしー】
MVCC(多版型同時実行制御) とは?
💡 過去の自分を残しておけば、読む人と書く人がケンカしない
📌 このページのポイント
- データを更新するとき、古いバージョンを残したまま新しいバージョンを作成する
- 読み取りは自分のトランザクション開始時点のバージョンを参照するのでロック不要
- PostgreSQLやMySQLのInnoDBなど主要なRDBMSで採用されている
- 古いバージョンが溜まるため、定期的なクリーンアップ(VACUUM等)が必要
MVCCってなんだか難しそうな名前だけど、何をする仕組みなの?
簡単に言うと「データベースで読む人と書く人が同時に作業できるようにする仕組み」だよ。図書館で例えると、本を書き直している最中でも、他の人は書き直す前のコピーを読めるイメージだね
ロックしなくていいってこと?
そうそう。読み取りのときはロックが不要なんだ。データを更新するときに古いバージョンを消さずに残しておいて、読み取り側は自分のトランザクション開始時点のバージョンを見るから、書き込みを待たなくていいよ
バージョンを残すってことは、データがどんどん増えちゃわない?
いいところに気づいたね!その通りで、古いバージョンは不要になったら掃除しないといけないんだ。PostgreSQLだとVACUUMという処理で定期的にお掃除するよ。これをサボると性能がどんどん落ちるんだ
PostgreSQL以外でもMVCCは使われてるの?
どっちの方式がいいの?
一長一短だよ。PostgreSQL方式はUndoログの管理が不要だけどVACUUMが必要。MySQL方式はVACUUM不要だけどUndoログの肥大化に注意が必要。大量の長時間トランザクションがあるとどちらも古いバージョンが溜まって性能に影響するから、トランザクションは短く保つのが鉄則だね
まとめ:ざっくりこれだけ覚えればOK!
「MVCC」って出てきたら「データの過去バージョンを残して読み書きを同時にできるようにする仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Multi-Version Concurrency Control」 = 多版型同時実行制御
💬 Multiple Versions(複数バージョン)で Concurrency(同時実行)を Control(制御)するという意味だよ