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

データベーススペシャリスト 2019年 午前210


問題文

の時刻でスケジュールされたトランザクションがある。時刻がcommitを発行する直前の、トランザクションの待ちグラフを作成した。aに当てはまるトランザクションはどれか。ここで、select()は共有ロックを掛けて資源を参照することを表し、update()は専有ロックを掛けて資源Xを更新することを表す。これらのロックは、commitされた時にアンロックされるものとする。また、トランザクションの待ちグラフの矢印は、としたとき、がロックしている資源のアンロックを、が待つことを表す。
データベーススペシャリスト 2019年 午前2 問10の問題画像

選択肢

(正解)

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

待ちグラフのノード対応【午前2解説】

正解の理由

図のノード a は「他ノードから矢印が来ていて(受け側)、かつ別ノードへ矢印を出している(発信側)」という特徴を持ちます。スケジュールから待ち関係を整理すると、T4→T2(T4がBの更新でT2の共有ロックを待つ)、T2→T1(T2がCの更新を要求しておりT1のロック解除を待っている)、T3→T1(T3がAの更新でT1の共有ロックを待つ)となります。これらの中で「受け側かつ発信側」の両方を満たすのは T2 だけです。したがってノード a は (T2)に対応します。

解法ステップ

  1. 各操作で取られるロックとその解放時期(commit時)に注意する。
  2. 時系列で「誰が誰のロック解除を待っているか」を列挙する。
    • t5: T4 が update(B) を要求。t2 の T2 が select(B) で共有ロックを保持しているため、T4 は T2 のアンロックを待つ → T4 → T2。
    • t8: T2 が update(C) を要求。t6 の T1 が select(C) で共有ロックを保持しているため、T2 は T1 のアンロックを待つ → T2 → T1。
    • t9: T3 が update(A) を要求。t1 の T1 が select(A) を保持しているため、T3 は T1 のアンロックを待つ → T3 → T1。
  3. 得られた待ち辺を図の有向辺と照合する。図で a は「d から矢印を受け、b へ矢印を出している」ので、受発双方を持つトランザクション(T2)に対応する。

選択肢別の誤答解説

  • ア: T1 — T1 は複数から待たれている(T2 と T3 が T1 のアンロックを待つ)が、T1 自身が誰かのロックを待っている操作は直前までにない(t10 で commit を発行する直前)。したがって「発信側」を持つ a には該当しない。
  • イ: T2 — 正解。t7/t8 により C の排他化(update)を要求しており T1 のロック解除を待っている(a→b の関係)。同時に t5 の T4 が B の更新で T2 の共有ロックを待っているため、受信辺も持つ(d→a)。よって a に一致する。
  • ウ: T3 — T3 は t9 の update(A) により T1 を待っている(発信側)が、T3 を待っている他トランザクションはこのスケジュールには存在しない(受信辺がない)。したがって a(受発両方)ではない。
  • エ: T4 — T4 は t5 の update(B) により T2 を待っている(発信側)。しかし T4 を待っているトランザクションはなく、受信辺を持たないため a ではない。

よくある誤解

  • 矢印の向き混同:矢印 T_i → T_j は「T_i が T_j のロック解除を待つ」ことを意味する点を逆に解釈しやすい。向きを間違えると待ち関係が全く逆になる。
  • select と update の違いを忘れる:select は共有ロックで複数同時保持可能、update は専有ロックで他の共有保持者の解放を要求する。select の段階ではブロックされないが、後で update によるアップグレードで待ち状態になる点を見落としがち。
  • ロックは commit まで解放されない:commit が来るまで保持されるため、後続の update はその時点のロック状態を基に待ちになる。

補足コラム

待ちグラフ(wait-for graph)はデッドロック検出に有効です。サイクル(循環)があればデッドロック発生の可能性があり、介入(タイムアウトやロールバック)による解消が必要です。本設問ではサイクルは発生しておらず、T1 の commit(t10)でロックが解放されれば待ち関係は解消します。ロックの種類やロックの昇格(shared→exclusive)は実務でも注意が必要で、特にアップグレード時に待ちが生じやすい点を覚えておきましょう。

FAQ

Q1: なぜ T2 の select(C)(t7)はブロックされなかったのですか?
A1: select は共有ロックを取得する操作で、既に T1 が共有ロックを持っていても複数保持は許されます。ブロックが発生したのはその後の update(排他化要求)時点です。
Q2: T3 と T2 のどちらがノード c や d に対応するかが分からない場合の確認方法は?
A2: ノードの入出力(受信・発信)数を確認します。スケジュールから「誰が誰を待っているか」を列挙し、各トランザクションの入次数・出次数と図の各ノードの入出次数を照合すると一意に対応づけできます。

関連キーワード: ロック制御、待ちグラフ、排他共有ロック、デッドロック検出、ロックアップグレード
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリスト
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

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

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