どういう状況で起きるの?
スレッドAがリソースXをロックしてからリソースYをロックしようとする。同時にスレッドBがリソースYをロックしてからリソースXをロックしようとする。AはBがYを解放するのを待ち、BはAがXを解放するのを待つ。お互い永遠に待ち続けてどちらも進めない。これがデッドロックだよ
データベースでも起きるの?
起きるよ。トランザクションAが行1をUPDATEしてロック→行2をUPDATE。トランザクションBが行2をロック→行1をUPDATE。互いにロック待ちになる。RDBMSはデッドロック検出機能を持っていて、検出するとどちらかのトランザクションをロールバックしてくれる。エラーを受けたらリトライするのが定石だよ
デッドロックの予防法は?
①ロック順序を統一(全スレッドがリソースA→B→Cの順でロック)、②タイムアウトを設定(一定時間ロックが取れなかったら諦める)、③ロックの粒度を小さく(テーブルロックではなく行ロック)、④楽観的ロック(ロックせずに更新時にバージョンチェック)。4条件のうち1つでも潰せばデッドロックは発生しないよ
IPA試験での出題パターンは?
「デッドロックの4条件(コフマンの条件)を答えよ」→相互排除、保持と待機、横取り不可、循環待ち。「デッドロックが発生するかの判定」にはリソース割当グラフ(待ちグラフ)で循環を検出する問題が出る。「銀行家のアルゴリズム」でデッドロック回避する問題もあるよ