【入門編】 MVCC (多版型同時実行制御) – PostgreSQL

こんにちは!データベースの世界へようこそ。

普段何気なく使っているアプリやWebサイト。私たちが裏側で「データを保存」したり「検索」したりするとき、実はとんでもない数のやり取りが同時に行われているのを知っていますか?

もし、誰かがデータを書き込んでいる最中に、他の人がそれを読もうとしたらどうなるでしょう?「書き込みが終わるまで、全員ストップ!」なんてことになったら、SNSのタイムラインも銀行の残高照会も、世界中のシステムがパンクしてしまいますよね。

そこで登場するのが、PostgreSQLの心臓部とも言える「MVCC(多版型同時実行制御)」という仕組みです。名前だけ聞くと難しそうですが、実は私たちの日常にある「ある工夫」とそっくりなんです。

—

MVCCって、結局なに?

MVCCを一言で言うと、「読み取りと書き込みがケンカしないための魔法」です。

これを理解するために、皆さんが「共同編集ができるドキュメント」を使っている場面を想像してみてください。

編集中の「下書き」のイメージ

あなたがGoogleドキュメントなどで、誰かと一緒に一つの文章を書いているとします。
あなたが書き込んでいる最中に、別の人がそのページを開いても、その人はあなたの「書きかけの、まだぐちゃぐちゃな文章」は見ませんよね?
その人が見ているのは、あなたが書き始める前の「完成された状態」か、あるいは「保存ボタンを押した後の最新版」のはずです。

PostgreSQLのMVCCも、まさにこれと同じことをしています。

  • 書き込みをする人: 別の場所に「新しい版(下書き)」を作って作業する。
  • 読み取りをする人: 今まさに作業中の書きかけデータではなく、その直前まで確定していた「綺麗な版」を見せてもらう。

こうすれば、お互いが相手の邪魔をせずに、同時に作業を進められますよね。これがMVCCの正体です。

—

データベースの中では何が起きているの?

では、データベースの中では具体的にどうなっているのか、もう少しだけ深掘りしてみましょう。

通常、データベースのテーブルにはデータが一つだけあるように思えますよね。でも、MVCCの世界では、一つのデータに対して「過去のバージョン」と「現在のバージョン」が同時に存在しています。

  • トランザクション(取引)の開始: あなたが「今から作業するよ!」と宣言すると、データベースは「今の時点でのデータ」をあなた専用のメガネ(スナップショット)として渡してくれます。
  • データの更新: あなたがデータを書き換えると、データベースは元のデータを消すのではなく、隣に「新しいバージョンのデータ」をこっそり追加します。
  • 一貫性の維持: 他の人が読み取ろうとしても、その人は「自分のメガネ(スナップショット)」を通してデータを見るので、あなたが作業中にこっそり追加したデータには目もくれません。

こうして、誰かが作業している間に、別の人がデータを読み取っても、中身がチグハグになることはないのです。

—

なぜこれが「最高」の仕組みなの?

ここがエンジニアとして一番推したいポイントなのですが、この仕組みのおかげで、私たちは「ロック(鍵)」をかける必要がほとんどないんです。

もしロックを使ってしまうと、読み取りたい人は書き込みが終わるまで待ちぼうけを食らいます。でも、MVCCなら「待ち時間ゼロ」で、誰の邪魔もせずに自分の仕事を続けられます。

PostgreSQLが世界中で愛され、多くの大規模システムで採用されている理由は、この「みんながストレスなく快適にアクセスできる」というMVCCの柔軟性にあると言っても過言ではありません。

—

最後に:少しだけ「掃除」の話

一つだけ補足すると、この仕組みには「データがどんどん増えていく」という副作用があります。だって、古いバージョンを消さずに残しているわけですからね。

PostgreSQLには「バキューム(VACUUM)」という、いわゆる「お掃除機能」が備わっています。「もう誰も見ていない古いバージョンは片付けていいよ」と、定期的に整理整頓してくれるんです。

この「古くなったら片付ける」というサイクルまで含めて、PostgreSQLは非常に効率よく動いているんですよ。

—

いかがでしたか?
「MVCC」という難しい言葉も、実は「みんなが気持ちよく作業するための気遣い」の塊なんだな、と感じてもらえたら嬉しいです。

データベースは、ただのデータの箱ではなく、こうした緻密な配慮が詰め込まれた「生き物」のような存在です。これからデータベースを触るたびに、裏側で繰り広げられるドラマを少しだけ想像してみてくださいね。

それでは、また次回の記事でお会いしましょう!

コメント

タイトルとURLをコピーしました