トランザクション・排他制御・分離レベル 重要度:★★★出題: AM2・PM1・PM2
デッドロック(Deadlock)の発生機構と回避設計
でっどろっくのはっせいきこうとかいひせっけい / Deadlock Prevention and Resolution
複数のトランザクションが互いに相手が保持するロックの解放を待ち続け、どちらも処理を進められなくなる膠着状態。
3行速習ポイント
- 複数テーブル(A→B と B→A)や同一テーブル内の複数行(主キー昇順と降順)を異なる順序でロック獲得すると発生する
- また同一行に対して2つのトランザクションが共有ロック取得後に専有ロックへ昇格(ロック変換)しようとした場合にも発生する
- 回避策は「テーブル・行のロック獲得順序を全トランザクションで統一すること」および「最初からFOR UPDATEで専有ロックを取得すること」
図解
図デッドロック発生メカニズムと回避原則
11. 逆順序ロック・昇格競合
循環待ち発生Tx1がA→B、Tx2がB→Aの順でロック要求(または共有→専有昇格競合)
22. 対策①:ロック順序の統一
順序統一全プログラムでテーブル順および主キー昇順(ORDER BY)にロック取得順を統一
33. 対策②:FOR UPDATE事前取得
先行排他更新予定の行は最初のSELECT時点で専有ロックを獲得し昇格デッドロックを防止
概要と本質
データベースの排他制御において最も重要なトラブルシューティングテーマです。RDBMSは待ちグラフ(Wait-For Graph)の閉路検出などによりデッドロックを自動検知し、一方のトランザクションを強制ロールバック(犠牲者選出)しますが、アプリケーション設計段階でデッドロックが起きないロック順序に統一することが不可欠です。
重要ポイント・コア概念
- 複数テーブル更新時の原則:すべてのプログラムでテーブルA→テーブルBの同一順序でロックを取得する
- 同一テーブル複数行更新時の原則:カーソルや更新対象抽出時に主キー(例:契約番号、商品コード)の昇順(ORDER BY)でソートしてから1行ずつロック・更新する
- 共有ロック→専有ロック昇格によるデッドロック防止:更新予定のSELECT文には最初からFOR UPDATE句を付与して専有ロックを取得する
午後I・午後II記述試験での攻略ポイント
午後I・午後IIでは「時系列に沿ったロック状態表(共有ロック/専有ロック、ロック済み/ロック解放待ち)の穴埋め」と「デッドロックを防ぐための改修方法(処理順序の入替え、ORDER BY句によるソート順統一、FOR UPDATEの付与)」がセットで出題されます。
午後記述で使える加点キーワード(クリックでコピー)
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着令和7年 秋期 午前II 問17
DBMS において,トランザクション間でデッドロックが発生していることを検出するために使用するものはどれか。...
この過去問を解く(1分演習)
令和6年 秋期 午前II 問13
トランザクション A〜G の待ちグラフにおいて, 永久待ちの状態になっているトランザクション全てを列挙したものはどれか。...
この過去問を解く(1分演習)
令和7年 秋期 午後I 問3
SQLの設計とトランザクション排他制御・索引設計...
この過去問を解く(1分演習)
令和6年 秋期 午後I 問2
労務管理システムにおけるSQL設計と排他制御・トランザクション制御...
この過去問を解く(1分演習)
データベーススペシャリスト 過去問演習で実践力を鍛える