データベーススペシャリスト試験 2022年 午前213


複数のバッチ処理を並行して動かすとき, デッドロックの発生をできるだけ回避したい。バッチ処理の設計ガイドラインのうち, 適切なものはどれか。
参照するレコードにも, 専有ロックを掛けるように設計する。
大量データに同じ処理を行うバッチ処理は、まとめて一つのトランザクションとして処理するように設計する。
トランザクション開始直後に, 必要なレコード全てに専有ロックを掛ける。ロックに失敗したレコードには, しばらく待って再度ロックを掛けるように設計する。
複数レコードを更新するときにロックを掛ける順番を決めておき、全てのバッチ処理がこれに従って処理するように設計する。(正解)

解説

複数のバッチ処理におけるデッドロック回避の設計ガイドライン【午前2 解説】

要点まとめ

  • 結論:ロックを掛ける順番を統一し、全バッチ処理が同じ順序でロックを取得する設計がデッドロック回避に有効です。
  • 根拠:デッドロックは複数の処理が互いに相手のロック解除を待つ状態で発生し、順序を統一することで循環待ちを防げます。
  • 差がつくポイント:単にロックを多用するのではなく、ロックの取得順序を厳格に管理することが重要で、これが設計の質を左右します。

正解の理由

選択肢エは「複数レコードを更新するときにロックを掛ける順番を決めておき、全てのバッチ処理がこれに従う」という設計方針を示しています。
これはデッドロックの根本原因である「循環待ち(サイクル)」を防ぐための代表的な対策であり、複数の処理が異なる順序でロックを取得しようとして互いに待ち合う状況を回避できます。
したがって、デッドロック発生をできるだけ回避したい場合に最も適切な設計ガイドラインです。

よくある誤解

ロックを多く掛ければ安全と思いがちですが、むしろロックの取得順序を統一しないとデッドロックが起こりやすくなります。
また、参照にも専有ロックを掛けると処理が遅くなり、効率が悪化します。

解法ステップ

  1. デッドロックの原因が「複数処理が互いにロックを待つ循環待ち」であることを理解する。
  2. 循環待ちを防ぐには、ロック取得の順序を全処理で統一する必要があると認識する。
  3. 選択肢の中で「ロックの順番を決めて全処理が従う」設計を探す。
  4. それが選択肢エであることを確認し、正解とする。

選択肢別の誤答解説

  • ア: 参照にも専有ロックを掛けると、不要なロック競合が増え処理効率が低下し、デッドロック回避には逆効果です。
  • イ: 大量データを一つのトランザクションで処理するとロック保持時間が長くなり、デッドロックや待ち時間が増加します。
  • ウ: トランザクション開始直後に全レコードに専有ロックを掛けるのは過剰で、待機や再試行が頻発し効率が悪化します。
  • エ: ロックの取得順序を統一し、全バッチ処理が従う設計はデッドロック回避の基本かつ効果的な方法です。

補足コラム

デッドロック回避には「ロックの順序統一」のほか、「タイムアウト設定」や「ロックの粒度調整」も有効です。
また、デッドロック検出機能を持つDBMSもありますが、設計段階での回避策が最も望ましいです。
バッチ処理の設計では、処理の並行性と効率性を両立させるためにロック設計が重要なポイントとなります。

FAQ

Q: なぜ参照処理に専有ロックを掛けるのは良くないのですか?
A: 参照は通常共有ロックで十分で、専有ロックを掛けると他の処理が待たされて性能低下やデッドロックのリスクが高まります。
Q: トランザクションを大きくまとめると何が問題ですか?
A: トランザクションが長時間ロックを保持するため、他の処理が待たされやすくなり、デッドロックやシステム全体の遅延が発生しやすくなります。

関連キーワード: デッドロック回避, ロック順序, バッチ処理設計, トランザクション管理, 専有ロック, 並行処理
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ