PostgreSQLの「XID(トランザクションID)」って何?―データの世界の背番号のお話
こんにちは!データベースの世界へようこそ。
普段、PostgreSQLを何気なく使っていると、「トランザクションID(XID)」なんて言葉、あまり意識することはありませんよね。
でも実はこれ、PostgreSQLという巨大な組織を裏で支える「背番号」のような、めちゃくちゃ重要な仕組みなんです。今日は少しだけ、この「背番号の秘密」と、それが引き起こすかもしれない「ある問題」について、コーヒーでも飲みながら気軽にお話ししてみましょう。
—
トランザクションID(XID)は「整理券」のようなもの
想像してみてください。あなたは今、超人気のアイスクリーム屋さんで働いています。そこには毎日、たくさんのお客さんがやってきます。
お客さんたちはみんな、「あのアイスをください!」と注文しますが、もし「誰がいつ注文したか」を記録しなかったらどうなるでしょう? お客さん同士の注文が混ざって、大混乱ですよね。
そこで登場するのが「整理券」です。
PostgreSQLもこれと同じことをしています。データに変更を加えるとき、「これは〇番さんの注文ですよ!」と印をつけるための番号、それがトランザクションID(XID)です。
PostgreSQLは、この番号のおかげで、「どのデータが最新で、どれがまだ処理中なのか」を正確に把握できているんですね。
—
「番号が足りない!」という大ピンチ
さて、ここからが少し面白い(そして怖い)話です。
この整理券ですが、実は「32ビット」という決まった枠しかありません。数字に直すと、だいたい40億枚くらい。
「40億枚あれば十分じゃない?」と思いましたか?
確かに大昔はそうだったかもしれません。でも、現代の忙しいシステムでは、あっという間に番号を使い切ってしまうんです。
もし、整理券が40億まで達してしまったらどうなるか。
なんと、番号は「0」に戻って、また最初からカウントし始めるんです!これを専門用語で「ラップアラウンド」と呼びます。
ここで問題発生です。
「あれ? 今の番号は『1番』だけど、これってさっきの『1番』? それとも、ぐるっと回って一周したあとの新しい『1番』?」
これでは、データの歴史がめちゃくちゃになってしまいますよね。
—
救世主「凍結処理(バキューム)」の登場
この大ピンチを救うために、PostgreSQLには「凍結(Freeze)」という特別な仕組みがあります。
先ほどのアイス屋さんで例えると、古い整理券はもう「過去の遺物」として倉庫にしまって、「これはもう確定済みだから、古い番号と混同しないように『凍結』しておこう!」とラベルを貼る作業です。
これを専門用語で「VACUUM(バキューム)」と呼びます。
PostgreSQLは定期的にこのバキュームを行って、「古い番号はもう気にしなくていいですよ!」と整理整頓することで、番号が一周してしまっても混乱しないように守っているんです。
—
私たちエンジニアが知っておくべきこと
ここまでの話をまとめると、こういうことになります。
- XIDは、PostgreSQLの「背番号」。
- この番号はいつか一周しちゃう(40億枚の上限がある)。
- 放っておくとシステムが壊れてしまうから、「バキューム」という掃除が不可欠。
もし皆さんがデータベースの運用に関わるなら、「バキュームがちゃんと動いているかな?」「古すぎるデータが溜まって、番号の枯渇が近づいていないかな?」と、たまに気にかけてあげてください。
まるで、散らかった机を片付けるようなもの。
最初は難しそうに見えるアーキテクチャも、実は「混乱を防ぐための工夫」でできていると分かると、なんだか少し愛着が湧きませんか?
データベースの深淵はまだまだ奥が深いですが、まずは「XIDという背番号を守るための掃除」があるんだな、ということだけ覚えて帰ってくださいね!
それでは、また次回の記事でお会いしましょう!
コメント