データベーススペシャリスト 2019年 午前2 問10
問題文

選択肢
ア:
イ:(正解)
ウ:
エ:
🔒 解説は解答すると表示されます
待ちグラフのノード対応【午前2解説】
正解の理由
図のノード a は「他ノードから矢印が来ていて(受け側)、かつ別ノードへ矢印を出している(発信側)」という特徴を持ちます。スケジュールから待ち関係を整理すると、T4→T2(T4がBの更新でT2の共有ロックを待つ)、T2→T1(T2がCの更新を要求しておりT1のロック解除を待っている)、T3→T1(T3がAの更新でT1の共有ロックを待つ)となります。これらの中で「受け側かつ発信側」の両方を満たすのは T2 だけです。したがってノード a は イ(T2)に対応します。
解法ステップ
- 各操作で取られるロックとその解放時期(commit時)に注意する。
- 時系列で「誰が誰のロック解除を待っているか」を列挙する。
- 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。
- 得られた待ち辺を図の有向辺と照合する。図で 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(排他化要求)時点です。
A1: select は共有ロックを取得する操作で、既に T1 が共有ロックを持っていても複数保持は許されます。ブロックが発生したのはその後の update(排他化要求)時点です。
Q2: T3 と T2 のどちらがノード c や d に対応するかが分からない場合の確認方法は?
A2: ノードの入出力(受信・発信)数を確認します。スケジュールから「誰が誰を待っているか」を列挙し、各トランザクションの入次数・出次数と図の各ノードの入出次数を照合すると一意に対応づけできます。
A2: ノードの入出力(受信・発信)数を確認します。スケジュールから「誰が誰を待っているか」を列挙し、各トランザクションの入次数・出次数と図の各ノードの入出次数を照合すると一意に対応づけできます。
関連キーワード: ロック制御、待ちグラフ、排他共有ロック、デッドロック検出、ロックアップグレード

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

