データベーススペシャリスト 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: ノードの入出力(受信・発信)数を確認します。スケジュールから「誰が誰を待っているか」を列挙し、各トランザクションの入次数・出次数と図の各ノードの入出次数を照合すると一意に対応づけできます。
関連キーワード: ロック制御、待ちグラフ、排他共有ロック、デッドロック検出、ロックアップグレード

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

