こんにちは!データベースの世界へようこそ。
PostgreSQLを触っていると、「MVCC(多版同時実行制御)」という、いかにも難しそうな言葉に出会ったことはありませんか?「これさえわかればデータベースマスター!」と言われるような重要概念なのですが、教科書の説明を読むと、たいてい初学者泣かせの難解な文章が並んでいますよね。
今日は、そんな重たい話は一旦置いておいて、「PostgreSQLが、あるデータを『見せるべきか、隠すべきか』をどうやって決めているのか」というお話を、身近な例えで紐解いていきたいと思います。
—
編集中の「付箋」を想像してみてください
皆さんのオフィスに、共有のホワイトボードがあると想像してください。そこには、チーム全員が見るべき「タスクリスト」が貼られています。
ここで、あるメンバー(トランザクションAと呼びましょう)が、タスクの内容を書き換えようとしています。でも、書き換えている途中に他のメンバー(トランザクションB)がホワイトボードを見たら、書きかけの汚い字や、半分消えかかったメモを見せてしまうことになりますよね。これでは混乱してしまいます。
そこでPostgreSQLは、こんな「魔法のルール」を使っています。
1. 「いつ書かれたか」というスタンプを押す
PostgreSQLは、すべてのデータ(タプル)に「誰が、いつ作成したか(開始スタンプ)」と「誰が、いつ削除したか(終了スタンプ)」という見えないタグを付けています。
2. 「私の今の時間はいつ?」という基準
トランザクションが始まった瞬間、そのトランザクションには「時計」が渡されます。この時計は、そのトランザクションが始まった時点の時刻をずっと指し示しています。
—
判定のルール:タプルは「見える?」
さて、いよいよ本題です。あるトランザクションがデータを見ようとしたとき、PostgreSQLは以下の3つの質問を心の中で自分に問いかけます。
- 「このデータは、私が作業を始める前に完成していたものかな?」
- Yesなら:はい、見せます。それはあなたが来る前からそこにある、確定した情報ですから。
- 「このデータは、今まさに他の誰かが書き換えている途中じゃないかな?」
- Yesなら:いいえ、見せません。書きかけのメモを他人に見せるのはマナー違反ですよね。
- 「このデータは、私が来る前に既に削除(無効化)されたものじゃないかな?」
- Yesなら:いいえ、見せません。それはもう過去のゴミ箱行きですから。
これだけで、PostgreSQLは誰にも迷惑をかけずに、常に最新かつ正確なデータを表示できるんです。
—
なぜ「ゴミ」が残るのか(おまけの話)
ここで鋭い方はこう思うかもしれません。「じゃあ、古いデータはすぐに消せばいいんじゃないの?」と。
実は、PostgreSQLはあえてすぐには消しません。なぜなら、そのデータをまだ「見ている誰か」がいるかもしれないからです。掃除のおじさん(VACUUMという機能)がやってきて、「もう誰もこの古いデータを見ていないな」と確認した時に初めて、ホワイトボードから剥がしてゴミ箱へ捨ててくれるのです。
この「すぐ消さずに残しておく」という余裕があるからこそ、PostgreSQLは驚くほど安定して、大人数で同時に作業してもデータが壊れないんですね。
—
まとめ:データベースは「気配り」で動いている
いかがでしたか?「タプルの可視性」なんて難しそうな名前がついていますが、要は「作業中のメモを他人に見せないための、ちょっとした気配りルール」のことなんです。
- 誰が
- いつ始めた作業で
- どのデータを見ようとしているか
この3つを照らし合わせるだけで、データベースは整然と整理されています。もし、これからPostgreSQLの難しい設定画面を開く機会があったら、「ああ、この裏でデータベースが一生懸命、みんなの作業が混ざらないように整理整頓してくれているんだな」と、少しだけ温かい目で見てあげてくださいね。
また次回の記事でも、データベースの不思議を紐解いていきましょう!それでは。
コメント