戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

応用情報技術者 2017年 春期 午前229


問題文

トランザクションAとBが、共通の資源であるテーブルaとbを表に示すように更新するとき、デッドロックとなるのはどの時点か。ここで、表中の①〜⑧は処理の実行順序を示す。また、ロックはテーブルの更新直前にテーブル単位で行い、アンロックはトランザクション終了時に行うものとする。
応用情報技術者 2017年 春期 午前2 問29の問題画像

選択肢

(正解)

🔒 解説は解答すると表示されます

相互待ち(デッドロック)【午前2解説】

正解の理由

問題のロックは「更新直前にテーブル単位で取得」し、アンロックは「トランザクション終了時」に行われます。時刻順に見ると、③でトランザクションAがテーブルaのロックを取得、④でトランザクションBがテーブルbのロックを取得します。続く⑤でAがテーブルbのロックを要求しますが、既にBがbを保持しているためAはbを取得できず待ち状態になります(この時点でAはaのロックを保持したまま)。その後⑥でBがテーブルaのロックを要求すると、aはAが保持しているためBも取得できず待ちになります。Aはbを、Bはaをそれぞれ待つ「循環待ち」が成立するのは⑥の時点です。したがって選択肢(⑥)が正解です。

解法ステップ

  1. ロック・アンロックのルールを確認:ロックは更新直前に取得、アンロックはトランザクション終了時まで保持。
  2. 時系列に沿ってどのトランザクションがどのロックを保持するかを書き出す。
    • ①: A開始(まだロックなし)
    • ②: B開始(まだロックなし)
    • ③: Aがaをロック(A: a、B: —)
    • ④: Bがbをロック(A: a、B: b)
    • ⑤: Aがbを要求 → bはBが保持 → Aは待ち(A: a(保持)、待ち for b;B: b(保持))
    • ⑥: Bがaを要求 → aはAが保持 → Bも待ち(B: b(保持)、待ち for a)
  3. ⑤で一方向の待ちが発生するが、デッドロック(循環待ち)が成立するのは⑥でBも待ちに入ったときであると判断する。

選択肢別の誤答解説

  • ア: ③
    ③はAがテーブルaをロックする時点です。まだBはbを取得しておらず、循環待ちは発生していません。したがってデッドロックの発生時点ではありません。
  • イ: ④
    ④はBがテーブルbをロックする時点です。Aはbを要求して待っていないため、ここでも循環待ちは未成立です。
  • ウ: ⑤
    ⑤でAはbの取得を試みますが、bは既にBが保持しているためAは待ちになります。ただし、この時点ではBはまだaを要求しておらず、片方向の待ち(Aがbを待つ)にとどまるためデッドロックとは言えません。デッドロックは相互に待つ「循環」が必要です。
  • エ: ⑥(正解)
    ⑥でBがaを要求して取得できないため、Aはbを、Bはaをそれぞれ待つ循環待ちが発生し、これがデッドロックです。

よくある誤解

  • 「⑤でAがbをロックしてしまう」と誤認する
    実際にはbは既にBが保持しており、Aは⑤で待ちになります。ロック取得可否を時間順に正確に追うことが重要です。
  • 「ロックはトランザクション開始時に全部取得される」と考える
    問題文のルール(更新直前に取得)を無視すると誤答につながります。取得タイミングを問題文で必ず確認してください。
  • 「アンロックが更新直後に即行われる」と誤解する
    本問ではアンロックはトランザクション終了時のため、保持期間が長くなることを前提に考える必要があります。

補足コラム

デッドロックの発生を表現するのに「待ちグラフ(wait-for graph)」が便利です。本問の状態を待ちグラフで表すと次のようになります(矢印は「待っている先」):
  • ⑤の時点: A → b(Bがbを保持)
    循環は形成されていない。
  • ⑥の時点: A → B(Aはbを待つ)かつ B → A(Bはaを待つ)
    循環(A ↔ B)が成立しデッドロック。 現場での対策は、(1)リソースの取得順序を統一する、(2)タイムアウト/デッドロック検出機構で一方をロールバックする、(3)より細かい粒度のロック(行ロック等)を使う、などがあります。二相ロック(2PL)を採ると一貫性は保てますが、デッドロックのリスクは残るため検出・回復策も必要です。

FAQ

Q. もしアンロックが更新直後に行われる設定なら結果は変わりますか?
A. はい。もしAが⑤の直後にbのロックをすでに取得できていたり、更新後すぐにアンロックされるならAとBが同時保持する状態が短くなり、今回のような循環待ちは発生しない可能性があります。設問のロック/アンロックルールを必ず前提に入れて考えてください。
Q. どのようにデッドロックを解消しますか?
A. 一般的にはデッドロック検出後にどちらか一方のトランザクションを強制ロールバックしてロックを解放させ、他方を再試行させます。事前にリソース取得順序を統一する設計で発生を予防することも有効です。
Q. ⑤は「待ち」のみでデッドロックじゃないのはなぜ?
A. デッドロックは「循環的な待ち(相互待ち)」が成立したときに定義されます。⑤はAがbを待つ一方向の待ちであり、まだBがaを待っていないため循環がないことが理由です。

関連キーワード: デッドロック、相互待ち、トランザクション、ロック、待ちグラフ、二相ロック、ロールバック、ロック順序設計
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

応用情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について