デッドロックとは?でっどろっく
デッドロックとは、二つ以上の処理がそれぞれ資源を確保したまま、互いに相手の確保している資源の解放を待ち、どちらも永久に先へ進めなくなる状態。相互排除・保持と待ち・横取り不可・循環待ちの4条件がすべてそろったときにだけ起こるので、どれか一つを崩せば発生しない。基本情報技術者試験では、二つのトランザクションがロックを獲得していく順序を並べて示し、待ちの輪が閉じるかどうかを追わせる形で問われる。
最終更新:2026-10-09
この語が出る過去問を解く →背景
ロックはデータの矛盾を防ぐために資源を一つの処理へ独占させる仕組み。ロックを持ったまま次のロックを待つことがある方式では、二つの処理が互いに相手の持つ資源を待つ輪ができうる。並行実行の結果を直列実行と同じにするための2相ロッキング(ロックを獲得する段階と解放する段階を分ける決まり)に従っても、この輪は防げない。そのため、獲得の順序をそろえて防ぐか、検出して片方を取り消すかで対処する。
具体例
トランザクションAがW→X→Y→Zの順にロックを獲得するとき、BもW→X→Y→Zと同じ順序で獲得すれば、Bは先にAが持つ資源の解放を待つだけで、AがBの持つ資源を待つことは起きず、待ちの輪は閉じない。逆にBがX→Wのように一部でも逆順に獲得すると、AはWを持ったままXを待ち、BはXを持ったままWを待つ形になって双方が止まる(令和元年度 秋期 基本情報技術者試験 午前 問29は、この獲得順序の組合せを見比べさせる問題)。PostgreSQLはこの状態を検出すると、片方に SQLSTATE 40P01(deadlock detected)を返して取り消す。
試験での引っ掛け
同じデータを扱う二つの処理なら必ず起きる、と考えるのが誤り。起きるのは獲得順序が逆転している組合せだけで、順序をそろえれば同じデータを扱っても発生しない。共有ロック(read)どうしは同時に保持できるため、輪が閉じるかを数えるときは専有ロック(update)の対象を見る。また「2相ロッキングに従えばデッドロックは起きない」も誤り。2相ロッキングが保証するのは競合直列可能性(並行して実行しても、1つずつ順に実行した結果と同じになること)であって、デッドロックの回避ではない。
関連用語
出た過去問
出典:令和元年度 秋期 基本情報技術者試験 午前 問29(IPA)
2相ロッキングプロトコルに従ってロックを獲得するトランザクションA、Bを図のように同時実行した場合に、デッドロックが発生しないデータ処理順序はどれか。ここで、r…
正解:①update X ②read W ③update Y ④update Z
要点:デッドロック回避の基本は、資源のロック順序を全体でそろえること
2相ロッキングでは獲得したロックをトランザクション終了まで解放しないため、2つのトランザクションが同じ2件のデータを互いに逆の順序でロックしようとするとデッドロックになる。トランザクションAはW、X、Y、Zの順に処理するので、Bも同じ相対順序でロックを取れば循環待ちは起きない。Wは共有ロックなので双方が同時に保持でき、待ちの原因にはならない点も判断材料になる。
出典・参考
公式シラバスの3 技術要素 > 4. トランザクション処理 > (1) 同時実行制御(排他制御)に掲載されている用語です。
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。