【入門編】 デッドロック検出アルゴリズム – PostgreSQL

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

今日は、PostgreSQLの裏側で密かに行われている「ちょっとしたトラブル解決劇」についてお話ししようと思います。

皆さんは、カフェでこんな経験をしたことはありませんか?
「隣の席の人が、私の使っている電源タップを貸してほしいと言う。でも、私は自分のスマホを充電するためにそのタップが必要。一方で、その人は私のスマホの充電器を貸してほしいと言っている……」

二人とも相手の持ち物を待っているせいで、お互いに一歩も動けない。これ、まさに「デッドロック」という状態なんです。

データベースの世界でも、実はこれと同じことが起こります。でも、PostgreSQLはとても優秀なので、こんな時でもパニックにならずにスマートに解決してくれるんですよ。

—

そもそも「デッドロック」って何?

データベースは、みんなが同時にデータにアクセスする場所です。
例えば、Aさんが「データ1」をロックして、Bさんが「データ2」をロックしたとします。その状態で、Aさんが「データ2」を使いたくてBさんが終わるのを待ち、同時にBさんが「データ1」を使いたくてAさんが終わるのを待つ……。

こうなると、お互いに「相手が終わるまで待とう」と固まってしまい、永久に誰も何もできない時間が流れます。これがデッドロックです。

PostgreSQLはどうやって見つけているの?

人間なら「ちょっと二人とも、譲り合ったら?」と声をかけられますよね。PostgreSQLも、まさにそれと同じことをやっています。

1. 「待機グラフ」という相関図を作る

PostgreSQLは、「誰が誰を待っているか」という関係性を、まるで家系図のように図として記録しています。これを「待機グラフ」と呼びます。

「AさんがBさんを待っている」「BさんがCさんを待っている」といった関係を繋げていくと、もしデッドロックが起きているなら、必ずどこかで「AさんがBさんを待っていて、BさんがAさんを待っている」という「ぐるぐる回る輪っか(循環参照)」が見つかるんです。

2. 「DeadlockDetector」の巡回

PostgreSQLには、この監視を専門に行う「DeadlockDetector(デッドロック検出器)」という係の人がいます。

ただ、この係の人はずっと目を光らせているわけではありません。実は、誰かがロック待ちを始めた時に「あれ?ちょっと待たされている時間が長いな」と感じた瞬間に、初めて動き出すんです。

具体的には、設定された時間(デフォルトだと1秒)が経過してもロックが取れないと、「おや、これはもしかしてデッドロックかも?」と判断して、先ほどの「待機グラフ」をチェックしに行きます。

トラブルが起きたらどうするの?

無事に「あ、やっぱり輪っかができてる!」と見つけたら、PostgreSQLは鬼ではありません。どちらか一方の処理を「ごめん!君には一度諦めてもらうね」といって、強制的にエラーを返して終了させます。

こうすることで、ロックが解放され、止まっていたもう一方の処理がスムーズに動き出すわけです。

—

まとめ:失敗しても大丈夫な仕組み

「えっ、エラーで止まっちゃうの?」と心配になるかもしれませんね。でも、これはデータベースを壊さないための、いわば「緊急停止ボタン」のようなものなんです。

もし皆さんの開発中にこのエラーに出会ったら、それは「PostgreSQLがシステム全体の平穏を守るために、賢い判断をしたんだな」と捉えてみてください。

デッドロックを防ぐコツは、「データを更新する順番を、システム全体でルール化しておくこと」です。みんなが同じ順番でデータに触れば、そもそも「待たせ合い」は起きませんからね。

データベースの世界は、こうして見えないところで細かな気遣いをしてくれています。これからも、この健気なPostgreSQLと一緒に、楽しく開発していきましょう!

また気になることがあれば、いつでも聞いてくださいね。それでは、また!

コメント

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