ホーム > システムアーキテクト試験 > 2022年
システムアーキテクト試験 2022年 午前2 問24
t₁t₁₀の時刻でスケジュールされたトランザクションT₁T₄がある。時刻t₁₀でT₁がcommitを発行する直前の、トランザクションの待ちグラフを作成した。aに当てはまるトランザクションはどれか。ここで、select(X)は共有ロックを掛けて資源Xを参照することを表し、update(X)は専有ロックを掛けて資源✕を更新することを表す。これらのロックは、commitされた時にアンロックされるものとする。また,トランザクションの待ちグラフの矢印は、Tᵢ→Tⱼとしたとき、Tⱼがロックしている資源のアンロックを、Tᵢが待つことを表す。

ア:
イ:(正解)
ウ:
エ:
解説
トランザクションの待ちグラフにおけるトランザクション識別【午前2 解説】
要点まとめ
- 結論:待ちグラフのノードaはトランザクションT₂に該当する。
- 根拠:待ちグラフの矢印は「Tᵢ→Tⱼ」でTᵢがTⱼのロック解除を待つことを示し、T₂のロック待ち関係と一致する。
- 差がつくポイント:ロックの種類(共有・専有)とアンロックタイミングを正確に理解し、待ちグラフの矢印の意味を誤らないことが重要。
正解の理由
問題文の待ちグラフでは、ノードaとdの間に相互に矢印があり、同様にbとcの間にも相互矢印があります。これはそれぞれのトランザクションペアが互いに相手のロック解除を待っている状態を示します。
時刻t₁₀直前のスケジュールから、T₂はselect(B)で共有ロックを取得後、t₈でupdate(C)の専有ロックを要求し、T₁がcommit直前でアンロックされていないため、T₂が待ち状態にあることがわかります。
この待ち関係がノードaに対応し、選択肢の中で該当するのはイ: T₂です。
時刻t₁₀直前のスケジュールから、T₂はselect(B)で共有ロックを取得後、t₈でupdate(C)の専有ロックを要求し、T₁がcommit直前でアンロックされていないため、T₂が待ち状態にあることがわかります。
この待ち関係がノードaに対応し、選択肢の中で該当するのはイ: T₂です。
よくある誤解
待ちグラフの矢印の向きを逆に解釈し、どちらが待っているかを誤ることがあります。
また、共有ロックと専有ロックの違いを理解せずにロックの競合を誤認することも多いです。
また、共有ロックと専有ロックの違いを理解せずにロックの競合を誤認することも多いです。
解法ステップ
- スケジュール表から各トランザクションのロック取得・解放タイミングを確認する。
- 待ちグラフの矢印の意味(Tᵢ→TⱼはTᵢがTⱼのロック解除を待つ)を正確に把握する。
- 相互に矢印があるノードペアは相互待ち状態(デッドロック)を示す。
- スケジュールのロック状況と待ちグラフの矢印を照合し、ノードaがどのトランザクションか特定する。
- 選択肢と照らし合わせて正解を選ぶ。
選択肢別の誤答解説
- ア: T₁
T₁はcommit直前でアンロックされるため、待ち状態のノードaには該当しません。 - イ: T₂
正解。T₂はロック待ち状態であり、ノードaに対応します。 - ウ: T₃
T₃はupdate(A)を行っていますが、待ちグラフのノードaの待ち関係とは一致しません。 - エ: T₄
T₄はselect(A)とupdate(B)を行っていますが、ノードaの待ち関係には該当しません。
補足コラム
待ちグラフはデッドロック検出に用いられ、ノード間の矢印は「待ち」の関係を示します。
共有ロックは複数トランザクションが同時に保持可能ですが、専有ロックは単独で保持され、他のトランザクションは待つ必要があります。
commit時にロックが解除されるため、commit直前の状態を正確に把握することが重要です。
共有ロックは複数トランザクションが同時に保持可能ですが、専有ロックは単独で保持され、他のトランザクションは待つ必要があります。
commit時にロックが解除されるため、commit直前の状態を正確に把握することが重要です。
FAQ
Q: 待ちグラフの矢印はどちらが待っていることを示しますか?
A: 矢印の出発点のトランザクションが、矢印の到達点のトランザクションのロック解除を待っています。
A: 矢印の出発点のトランザクションが、矢印の到達点のトランザクションのロック解除を待っています。
Q: 共有ロックと専有ロックの違いは何ですか?
A: 共有ロックは複数トランザクションが同時に取得可能ですが、専有ロックは単独で保持され、他は待つ必要があります。
A: 共有ロックは複数トランザクションが同時に取得可能ですが、専有ロックは単独で保持され、他は待つ必要があります。
Q: commit時にロックはどうなりますか?
A: commitが行われると、そのトランザクションが保持している全てのロックは解除されます。
A: commitが行われると、そのトランザクションが保持している全てのロックは解除されます。
関連キーワード: トランザクション管理, 待ちグラフ, ロック制御, デッドロック, 共有ロック, 専有ロック