IT用語

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とは「データの過去バージョンを見せて、読み書きをスムーズにする仕組み」です。

ABOUT ME
クマノくらげ
クマノくらげ
難しいIT用語やビジネス用語を、できるだけ身近な例えで解説するブログです。 「専門用語を見ると眠くなる人」でも読めるように、画像や会話形式を多めにしています。 AWS12冠達成済み。
記事URLをコピーしました