基本情報技術者 2011年 秋期 午前(科目A) 問34
問題文
DBMSにおけるデッドロックの説明として、適切なものはどれか。
選択肢
ア:2相ロックにおいて、第1相目でロックを行ってから第2相目でロックを解除するまでの状態のこと
イ:ある資源に対して専有ロックと専有ロックが競合し、片方のトランザクションが待ち状態になること
ウ:あるトランザクションがアクセス中の資源に対して、他のトランザクションからアクセスできないようにすること
エ:複数のトランザクションが、互いに相手のロックしている資源を要求して待ち状態となり、実行できなくなること(正解)
DBMSにおけるデッドロックの説明【午前2 解説】
要点まとめ
- 結論→デッドロックは複数のトランザクションが互いに相手のロックを要求して待ち続け、永続的に進行不能になる状態で回復措置が必要です。
- 根拠→循環待ち(AがBの資源を待ち、BがAの資源を待つ等)が発生すると、どちらも進行できずシステム応答が停止します。
- 差がつくポイント→ロック競合や2相ロックの意味を区別し、検出(ウォイトフォアグラフ)・予防(順序付けやタイムアウト)・回復の違いを理解すること。
正解の理由
正解は エ です。
デッドロックとは「複数のトランザクションが互いに相手のロックしている資源を要求して待ち、相互に解除されない状態(循環待ち)となり実行できなくなること」を指します。
この選択肢は「互いに相手のロックしている資源を要求して待ち状態となり、実行できなくなる」という定義を正確に表しているため正解です。
デッドロックとは「複数のトランザクションが互いに相手のロックしている資源を要求して待ち、相互に解除されない状態(循環待ち)となり実行できなくなること」を指します。
この選択肢は「互いに相手のロックしている資源を要求して待ち状態となり、実行できなくなる」という定義を正確に表しているため正解です。
よくある誤解
- 「ロック競合=デッドロック」と誤解する:単純なロック待ち(片方が待つ状態)は競合で、両者が互いに待つ循環がなければデッドロックではありません。
- 「2相ロックそのものがデッドロック」と思う:2相ロックはプロトコルであり、適切に運用すればデッドロックを誘発する場合もあるが同義ではありません。
- 「デッドロックは必ず即時検出される」と考える:実運用ではタイムアウトや検出周期により遅延して検出・回復されることが多いです。
解法ステップ
- 問題文のキーワードを確認:「互いに」「待ち状態」「実行できなくなる」「相手のロック」など循環待ちを示す語句を探す。
- 選択肢をロック競合(単方向の待ち)とデッドロック(双方向以上の循環待ち)で分類する。
- 2相ロックや排他/共有の定義と混同していないか確認する。
- 「循環」や「互いに要求して待つ」表現がある選択肢を正答とする。
選択肢別の誤答解説
- ア: 「2相ロックにおいて、第1相目でロックを行ってから第2相目でロックを解除するまでの状態のこと」
解説:2相ロック(Two-Phase Locking)は「取得(成長)相」と「解放(縮小)相」から成るプロトコルそのものを指します。選択肢はプロトコルの説明としても不正確であり、デッドロックの定義ではありません。 - イ: 「ある資源に対して専有ロックと専有ロックが競合し、片方のトランザクションが待ち状態になること」
解説:これはロック競合(単方向の待ち)を説明しており、相互に待つ循環(デッドロック)ではないため誤りです。 - ウ: 「あるトランザクションがアクセス中の資源に対して、他のトランザクションからアクセスできないようにすること」
解説:これは排他ロック(ミューテックス)の説明で、資源の独占を指すだけでデッドロックの定義ではありません。 - エ: 「複数のトランザクションが、互いに相手のロックしている資源を要求して待ち状態となり、実行できなくなること」
解説:この選択肢はデッドロックの正確な説明であり正解です(エ)。
補足コラム
- デッドロック発生の必要条件(Coffmanの4条件)
- 相互排他(資源は同時に1プロセスしか使えない)
- 保持かつ待機(資源を保持したまま他を待つ)
- 非強制解放(他が保持する資源を強制的に奪えない)
- 循環待ち(循環的に待ち状態が生じる)
これらが全て成立するとデッドロックが発生します。
- 検出と回復:ウォイトフォアグラフで循環(サイクル)を検出して、いずれかのトランザクションを強制終了(ロールバック)して解消します。
- 予防策:資源の順序化、タイムアウト、資源奪取(プリエンプション)などで発生条件を破る方法があります。
- 実務ではデッドロックは避けられないため、検出と回復の仕組みを設けるのが一般的です。
FAQ
Q: ロック競合とデッドロックの違いは?
A: ロック競合は一方が待つ単方向の待ち。デッドロックは互いに相手を待つ循環待ちで、双方(または複数)が進行不能になります。
A: ロック競合は一方が待つ単方向の待ち。デッドロックは互いに相手を待つ循環待ちで、双方(または複数)が進行不能になります。
Q: 2相ロック(2PL)はデッドロックを防ぐか?
A: 2PL自体は一貫性を保証しますが、デッドロック発生を防ぐものではありません。適切な資源順序やタイムアウトと併用が必要です。
A: 2PL自体は一貫性を保証しますが、デッドロック発生を防ぐものではありません。適切な資源順序やタイムアウトと併用が必要です。
Q: デッドロック検出の一般的手法は?
A: ウォイトフォアグラフを構築してサイクルを検出する方法が一般的で、検出後にトランザクションを中止して回復します。
A: ウォイトフォアグラフを構築してサイクルを検出する方法が一般的で、検出後にトランザクションを中止して回復します。
関連キーワード: デッドロック、ロック競合、相互待ち、循環待ち、2相ロック、排他ロック、共有ロック、ウォイトフォアグラフ、トランザクション、検出と回復、資源順序化、タイムアウト、プリエンプション、DBMS

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

