データベーススペシャリスト試験 2013年 午前217


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

解説

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

要点まとめ

  • 結論:複数レコードの更新順序を統一し、全バッチ処理が同じ順序でロックを取得する設計がデッドロック回避に効果的です。
  • 根拠:デッドロックは複数の処理が互いに相手のロック解除を待つ状態で発生し、ロック取得順序の統一で循環待ちを防げます。
  • 差がつくポイント:ロックの範囲やタイミングを適切に管理し、無駄なロックや長時間のトランザクションを避けることが重要です。

正解の理由

選択肢エは「複数レコードを更新するときの順番を決めておき、全てのバッチ処理がこれに従う」設計を示しています。
これはデッドロックの典型的な原因である「循環待ち」を防ぐための基本的な対策です。
全処理が同じ順序でロックを取得すれば、互いに相手のロック解除を待つ状態が発生しにくくなります。
したがって、デッドロック回避に最も適した設計ガイドラインです。

よくある誤解

参照レコードに専有ロックをかけると安全と思いがちですが、不要なロックは逆に競合を増やしデッドロックを誘発します。
また、トランザクションを大きくまとめるとロック保持時間が長くなり、デッドロックのリスクが高まります。

解法ステップ

  1. デッドロックの原因を理解する(循環待ち状態の発生)。
  2. ロック取得の順序がバラバラだと循環待ちが起きやすいことを確認。
  3. ロック取得順序を統一する設計が有効であることを認識。
  4. 選択肢の中からロック取得順序の統一を示すものを選ぶ。
  5. 他の選択肢の問題点(過剰ロック、大きなトランザクション、待機ループ)を排除。

選択肢別の誤答解説

  • ア: 参照にも専有ロックをかけるとロック競合が増え、デッドロックのリスクが高まります。
  • イ: 大量データを一つのトランザクションで処理するとロック保持時間が長くなり、デッドロックや性能低下を招きます。
  • ウ: トランザクション開始直後に全ロックを取得し、失敗時に待機する設計は待機時間が長くなり、システム全体のスループット低下やデッドロックの温床になります。
  • : ロック取得順序を統一し、全バッチ処理が従うことで循環待ちを防ぎ、デッドロック回避に最適です。

補足コラム

デッドロックは複数のトランザクションが互いに相手のロック解除を待つ状態で、システムの停止や性能低下を招きます。
対策としてはロックの粒度を適切に設定し、ロック取得順序の統一、トランザクションの短縮化、タイムアウト設定などがあります。
特にロック取得順序の統一は最も基本的かつ効果的な方法で、多くのデータベース設計で推奨されています。

FAQ

Q: なぜ参照時に専有ロックをかけるのは良くないのですか?
A: 参照は共有ロックで十分であり、専有ロックは他処理のアクセスを不必要に制限し、デッドロックの原因になります。
Q: トランザクションをまとめると何が問題ですか?
A: トランザクションが長時間ロックを保持し続けるため、他の処理が待たされデッドロックや性能低下のリスクが高まります。
Q: ロック取得順序を統一するとは具体的にどうするのですか?
A: 更新対象のレコードやテーブルをあらかじめ決めた順番でロックし、全処理が同じ順序でロックを取得することです。

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

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