令和4年度 春期 システムアーキテクト試験 午前II 問24

t1t_1〜t10t_{10}の時刻でスケジュールされたトランザクション T1T_1〜T4T_4がある。時刻 t10t_{10}で T1T_1が commit を発行する直前の,トランザクションの待ちグラフを作成した。空欄 a に当てはまるトランザクションはどれか。ここで,select (X) は共有ロックを掛けて資源 X を参照することを表し,update (X) は専有ロックを掛けて資源 X を更新することを表す。これらのロックは,commit された時にアンロックされるものとする。また,トランザクションの待ちグラフの矢印は,Ti→TjT_i \rightarrow T_j としたとき,TjT_j がロックしている資源のアンロックを,TiT_i が待つことを表す。

〔トランザクションのスケジュール〕
図の説明テキスト

〔トランザクションのスケジュール〕

時刻 トランザクション T1T_1 トランザクション T2T_2 トランザクション T3T_3 トランザクション T4T_4
t1t_1 select (A) - - -
t2t_2 - select (B) - -
t3t_3 - - select (B) -
t4t_4 - - - select (A)
t5t_5 - - - update (B)
t6t_6 select (C) - - -
t7t_7 - select (C) - -
t8t_8 - update (C) - -
t9t_9 - - update (A) -
t10t_{10} commit - - -
〔トランザクションの待ちグラフ〕
図の説明テキスト

〔トランザクションの待ちグラフ〕
ノード a、b、c、d からなる有向グラフ。
矢印の向きは以下の通り。
・b から a への矢印
・a から d への矢印
・b から c への矢印
・c から b への矢印
・c から d への矢印
・d から c への矢印

解答・解説

正解: イ. T2T_2

問題で与えられたトランザクションのスケジュールをもとに、各時刻におけるロックの状態と、競合による待ち状態(矢印)を整理します。
共有ロック(select)同士は競合せず同時にロックできますが、専有ロック(update)は他の共有ロックや専有ロックと競合し、アンロックを待つことになります。

  1. 時刻 t1t_1 〜 t4t_4 のロック状態
    各トランザクションが以下の共有ロックを獲得します。すべて競合せず成功します。
  • t1t_1:T1T_1 が資源Aに共有ロック
  • t2t_2:T2T_2 が資源Bに共有ロック
  • t3t_3:T3T_3 が資源Bに共有ロック
  • t4t_4:T4T_4 が資源Aに共有ロック
  1. 時刻 t5t_5 の待ち状態
    T4T_4 が資源Bに専有ロック(update (B))を要求します。すでに T2T_2 と T3T_3 が資源Bに共有ロックを掛けているため、T4T_4 は待ち状態となります。
    これにより、T4→T2T_4 \rightarrow T_2 および T4→T3T_4 \rightarrow T_3 の矢印が発生します。

  2. 時刻 t6t_6 〜 t7t_7 のロック状態
    以下の共有ロックを獲得し、成功します。

  • t6t_6:T1T_1 が資源Cに共有ロック
  • t7t_7:T2T_2 が資源Cに共有ロック
  1. 時刻 t8t_8 の待ち状態
    T2T_2 が資源Cに専有ロック(update (C))を要求します。すでに T1T_1 が資源Cに共有ロックを掛けているため、T2T_2 は待ち状態となります(自身の共有ロックは待機対象に含めません)。
    これにより、T2→T1T_2 \rightarrow T_1 の矢印が発生します。

  2. 時刻 t9t_9 の待ち状態
    T3T_3 が資源Aに専有ロック(update (A))を要求します。すでに T1T_1 と T4T_4 が資源Aに共有ロックを掛けているため、T3T_3 は待ち状態となります。
    これにより、T3→T1T_3 \rightarrow T_1 および T3→T4T_3 \rightarrow T_4 の矢印が発生します。

  3. グラフの依存関係とノードの特定
    ここまでで発生した待ち状態(矢印)は以下の5つです。

  • T4→T2T_4 \rightarrow T_2
  • T4→T3T_4 \rightarrow T_3
  • T2→T1T_2 \rightarrow T_1
  • T3→T1T_3 \rightarrow T_1
  • T3→T4T_3 \rightarrow T_4

各トランザクションから出る矢印(自分が待っている相手)の数を整理します。

  • T1T_1:出ていく矢印 0本
  • T2T_2:出ていく矢印 1本(T1T_1 へ)
  • T3T_3:出ていく矢印 2本(T1T_1, T4T_4 へ)
  • T4T_4:出ていく矢印 2本(T2T_2, T3T_3 へ)
    また、T3T_3 と T4T_4 は互いに待ち合っており、双方向の矢印が存在します。

図表のグラフの構造と照らし合わせます。

  • ノード d は他のノードへの矢印が出ていないため、T1T_1 に対応します。
  • ノード a は d(T1T_1)へ1本だけ矢印を出しているため、T2T_2 に対応します。
  • ノード b と c は互いに矢印を出し合っているため、T3T_3 または T4T_4 です。b は a(T2T_2)へ矢印を出しているため T4T_4、c は d(T1T_1)へ矢印を出しているため T3T_3 に対応します。

したがって、空欄 a に当てはまるトランザクションは T2T_2 となり、正解は「イ」です。

各選択肢の解説

  • ア(T1T_1):他のトランザクションを待っていないため、ノード d に該当します。
  • イ(T2T_2):正解です。ノード a に該当します。
  • ウ(T3T_3):T1T_1 と T4T_4 を待っているため、ノード c に該当します。
  • エ(T4T_4):T2T_2 と T3T_3 を待っているため、ノード b に該当します。

Spineチーム