MVCCとは?古いデータを見せて読み書きをスムーズにする仕組みを画像多めで解説!
この記事でわかること
・MVCCとは何か
・なぜ古いバージョンを残すのか
・MVCCとロックの違い
・MVCCのメリットと注意点
・PostgreSQLやMySQLなどで使われる理由
MVCCとは?

MVCCって何?
データベースの話で出てきたんだけど、名前からして難しそう。

MVCCは確かに名前が難しいよね。
正式には Multi-Version Concurrency Control っていうんだ。

マルチ……何?

日本語っぽく言うと、複数バージョン同時実行制御だね。

余計に難しくなった気がする。

だよね。
でも考え方自体はそこまで難しくないよ。
MVCCを一言でいうと、
データの過去バージョンを残しておくことで、読み取りと書き込みを同時にしやすくする仕組みだよ。

過去バージョンを残す?

そう。
たとえば、あるデータがあったとするよね。
残高:10,000円
ここで誰かが残高を更新している最中だとする。
残高:10,000円 → 8,000円に更新中
このとき、別の人が残高を見ようとしたらどうするか。

普通に考えると、更新が終わるまで待つんじゃないの?

それがロック中心の考え方だね。
でもMVCCでは、更新中でも、読み取り側には更新前のバージョンを見せることができる。


つまり、書き込み中でも読む側は待たなくていいってこと?

そうそう。
MVCCでは、データを更新するときに、古いデータをすぐ消さずに残しておく。
だから、読む人はその時点で見てよいバージョンを読めるんだ。
MVCCの基本イメージ


図っぽくすると、こんな感じ。
最初のデータ
商品A:在庫10個
↓ 誰かが更新する
古いバージョン:在庫10個
新しいバージョン:在庫9個

同じ商品Aのデータが、古い版と新しい版で残るの?

そういうイメージ。
実際の内部実装はデータベース製品によって違うけど、「データの版を複数持つ」と考えるとわかりやすいよ。
なぜMVCCが必要なの?

でも、なんでわざわざ古いデータを残すの?

理由は、読み取りと書き込みがぶつかりにくくなるからだね。

ぶつかる?


たとえば、データベースでは同時にいろんな人が操作している。
- Aさんがデータを読んでいる
- Bさんが同じデータを更新している
- Cさんも別のデータを読んでいる
こういうことが普通に起きる。

もし毎回ロックしていたら、誰かが更新している間、読む人がずっと待たされることがある。

それは遅くなりそう。

そう。
MVCCを使うと、更新中でも読み取り側は古い確定済みデータを読めるから、待ち時間を減らしやすいんだ。
MVCCのメリット

MVCCのメリットはこんな感じ

| メリット | 説明 |
|---|---|
| 読み取りが待たされにくい | 書き込み中でも過去バージョンを読める |
| 同時処理に強い | 複数人が同時にDBを使いやすい |
| 一貫したデータを読みやすい | 読み始めた時点の状態を見られる |
| ロックの競合を減らしやすい | 読み取りと書き込みがぶつかりにくい |

「読み取りが待たされにくい」が大きそうだね。

そうだね。
特に、読む処理が多いシステムではありがたい仕組みだよ。
ロックとの違い

ロックとの違いを整理しておきたいな。

ざっくり言うと、ロックは
「今使っているから、他の人は待ってて」
という考え方。
MVCCは、
「更新中でも、読む人には前のバージョンを見せよう」
という考え方だね。

トランザクションとMVCC

MVCCでは、トランザクションごとに「どの時点のデータを見るか」が管理されるんだ。

トランザクションって、処理のまとまりのことだよね?

そう。
データベースでは、複数の処理をひとまとまりとして扱うことがある。
たとえば銀行振込なら、
Aさんの残高を減らす
Bさんの残高を増やす
この2つをセットで成功させたい。

片方だけ成功したら困るもんね。

そう。
MVCCは、こういうトランザクションが同時に動いているときに、
それぞれが一貫したデータを見られるようにするためにも使われる。
MVCCの注意点

MVCCって便利そうだけど、デメリットはないの?

あるよ。
代表的なのは、古いバージョンを残す分、管理が必要になること。

| 注意点 | 説明 |
|---|---|
| 古いデータが増える | 過去バージョンを残すため容量を使う |
| 掃除が必要 | 不要になった古いバージョンを消す必要がある |
| 更新同士は衝突することがある | 同じデータを同時に更新すると競合する場合がある |
| 仕組みが複雑 | 内部的な管理が少し難しい |

古いバージョンを残すから、ゴミが増えるみたいな感じ?

そう。
だからデータベースによっては、不要になった古いデータを掃除する仕組みがある。
PostgreSQLのVACUUMみたいなものが有名だね。
MVCCが使われる場面

MVCCって、どんなところで使われているの?

有名なデータベースで使われているよ。
たとえば、
- PostgreSQL
- MySQLのInnoDB
- Oracle Database
- SQL Serverの一部機能
などで、MVCCに近い仕組みが使われている。

けっこう普通に使われてるんだ。

そう。
Webサービスみたいに、たくさんの人が同時にアクセスするシステムでは、同時実行制御がすごく大事なんだ。
MVCCを一枚でまとめるなら

| 用語 | 一言でいうと |
|---|---|
| Multi-Version | データの複数バージョンを持つ |
| Concurrency Control | 同時実行をうまく制御する |
| MVCC | 複数バージョンを使って読み書きを両立しやすくする仕組み |
まとめ

MVCCって
データの古いバージョンを残しておき、
読み取りと書き込みを同時にしやすくする仕組み。
ってことだね。

うん、完璧。
誰かがデータを更新している間でも、読む側は前の状態を見られるんだね。

MVCCとは、データの古いバージョンを残しておき、読み取りと書き込みを同時にしやすくする仕組みです。
ポイントは次の通りです。
・MVCCは Multi-Version Concurrency Control の略
・データの複数バージョンを使って同時実行を制御する
・読み取り側は、確定済みの過去バージョンを読める
・読み取りと書き込みがぶつかりにくくなる
・ただし、古いバージョンの掃除や更新競合には注意が必要
初心者向けに一言でまとめるなら、MVCCとは「データの過去バージョンを見せて、読み書きをスムーズにする仕組み」です。

