基本情報技術者 2018年 秋期 午前(科目A) 問29
問題文
ロックの粒度に関する説明のうち、適切なものはどれか。
選択肢
ア:データを更新するときに、粒度を大きくすると、他のトランザクションの待ちが多くなり、全体のスループットが低下する。(正解)
イ:同一のデータを更新するトランザクション数が多いときに、粒度を大きくすると、同時実行できるトランザクション数が増える。
ウ:表の全データを参照するときに、粒度を大きくすると、他のトランザクションのデータ参照を妨げないようにできる。
エ:粒度を大きくすると、含まれるデータ数が多くなるので、一つのトランザクションでかけるロックの個数が多くなる。
ロックの粒度に関する説明【午前2 解説】
要点まとめ
- 結論:ロックの粒度を大きく(粗く)すると単一ロックが広範囲を保護するため競合が増え、他トランザクションの待ちが増えて全体のスループットが低下します。
- 根拠:粒度は「ロックが覆うデータ範囲」を示し、粗い粒度は排他範囲が広がる一方、細かい粒度はロック数と管理コストが増えるというトレードオフがあります。
- 差がつくポイント:更新頻度や参照パターンで適切な粒度を選ぶこと。多更新時は細粒度、範囲参照や簡潔管理性重視では粗粒度が有利になる点を判断基準にしてください。
正解の理由
アが正解です。理由は「粒度が大きい=ロックが粗い=一つのロックでより多くのデータ領域を占有する」ため、同時にアクセスしたい他トランザクションが待たされる可能性が高くなり、結果としてスループット(同時処理量)が低下するためです。データベースの並行性制御の基本的なトレードオフに合致します。
よくある誤解
- 「粒度が大きいとロックの個数が増える」と誤解する受験者が多いですが、逆に一つのロックで広い範囲を保護するためロック個数は減ります。
- 「細かい粒度は必ず良い」と考えがちですが、細粒度はロックの管理オーバーヘッドやデッドロック発生の可能性を高める点を見落としやすいです。
- 「参照(読み取り)では粒度は関係ない」と考えるのも誤りで、読み取りでもロック方式によっては他のトランザクションを阻害する場合があります(排他ロック等)。
解法ステップ
- 設問の「粒度が大きい/小さい」がどちらを意味するか(大きい=粗い、細かい=小さい)を確認する。
- 粒度が変わると「1ロックで覆うデータ範囲」と「ロック数/管理コスト」がどう変化するかを整理する。
- 各選択肢を「待ち(競合)」「同時実行可能数」「ロック個数」「参照妨害」などの観点で当てはめる。
- トレードオフに矛盾する選択肢は誤りと判断する(例:粗い粒度で同時実行数が増える等)。
選択肢別の誤答解説
- ア: 正しい。粒度が大きい=ロックが粗い=占有範囲が広がるため、他トランザクションの待ちが増え、全体スループットが低下する。
- イ: 誤り。同一データを更新するトランザクションが多い状況では粒度を大きくすると競合が増え、むしろ同時実行できるトランザクション数は減少します。細粒度にすると排他競合を局所化できるため同時実行性は改善される場合があります。
- ウ: 誤り。表の全データを参照する場合、粒度を大きくすると(たとえばテーブルロック)それが他トランザクションの参照や更新を妨げることが多く、妨げないようにできるとは言えません。場合によっては逆に妨げます。
- エ: 誤り。粒度を大きくすると一つのロックがより多くのデータをカバーするため、トランザクションが必要とするロックの個数は通常減ります。エの記述は方向が逆です。
補足コラム
ロック粒度の代表例はテーブルロック、ページロック、行ロックです。テーブルロックは管理が簡単でオーバーヘッドが小さい反面競合が起きやすく、行ロックは並行性が高いがロック管理コストやデッドロック可能性が増えます。近年はMVCC(多版本並行制御)を採用するDBが多く、読み取りと書き込みの競合を軽減するアプローチも一般的です。実運用ではアクセスパターンに合わせてロック戦略やインデックス設計、トランザクションの粒度設計(短く保つ)を組み合わせて対処します。
FAQ
Q1: 粒度が細いと必ず性能が上がりますか?
A1: いいえ。細粒度は同時実行性を高める一方でロック管理コストやデッドロックの可能性を増やすため、必ずしも性能向上につながりません。ワークロード次第です。
A1: いいえ。細粒度は同時実行性を高める一方でロック管理コストやデッドロックの可能性を増やすため、必ずしも性能向上につながりません。ワークロード次第です。
Q2: 「粒度が大きい=ロック数が増える」と覚えていいですか?
A2: いいえ。粒度が大きいと一つのロックで多くのデータを保護するため、必要なロック数は減ります。ここを取り違えないでください。
A2: いいえ。粒度が大きいと一つのロックで多くのデータを保護するため、必要なロック数は減ります。ここを取り違えないでください。
Q3: 参照(SELECT)でもロック粒度は重要ですか?
A3: はい。使用するロックモード(共有ロック/排他ロック)やMVCCの有無によって参照が他の更新を阻害する場合があるため重要です。
A3: はい。使用するロックモード(共有ロック/排他ロック)やMVCCの有無によって参照が他の更新を阻害する場合があるため重要です。
Q4: 実装でよく使われる対策は何ですか?
A4: インデックスで範囲を限定してロック対象を減らす、トランザクションを短くする、MVCCを利用する、必要に応じてロックエスカレーションポリシーを調整する等があります。
A4: インデックスで範囲を限定してロック対象を減らす、トランザクションを短くする、MVCCを利用する、必要に応じてロックエスカレーションポリシーを調整する等があります。
関連キーワード: ロック粒度、ロック競合、トランザクション並行性、行ロック、テーブルロック、ロックエスカレーション、MVCC、データベース性能

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

