平成25年度 春期 データベーススペシャリスト試験 午前II 問17
【問題17】
複数のバッチ処理を並行して動かすとき、デッドロックの発生をできるだけ回避したい。バッチ処理の設計ガイドラインのうち、適切なものはどれか。
参照するレコードにも、専有ロックをかけるように設計する。
大量データに同じ処理を行うバッチ処理は、まとめて一つのトランザクションとして処理するように設計する。
トランザクション開始後に、必要なレコード全てに専有ロックをかける。ロックに失敗したレコードには、しばらく待って再度ロックをかけるように設計する。
複数レコードを更新する時の順番を決めておき、全てのバッチ処理がこれに従って処理するように設計する。
【解説】
ア: 参照するレコードにも、専有ロックをかけるように設計する。
誤り。参照するレコードに専有ロックをかけると、他の処理がそのレコードにアクセスできなくなり、デッドロックの原因になります。参照用のロックは共有ロックを使うべきです。
イ: 大量データに同じ処理を行うバッチ処理は、まとめて一つのトランザクションとして処理するように設計する。
誤り。大量データを一つのトランザクションにまとめると、トランザクションが長時間実行され、他の処理がロックを取得できず、デッドロックが発生しやすくなります。
ウ: トランザクション開始後に、必要なレコード全てに専有ロックをかける。ロックに失敗したレコードには、しばらく待って再度ロックをかけるように設計する。
誤り。この方法では、他の処理がロックを待機し続けるため、デッドロックが発生しやすくなります。ロックを取得できない場合に再試行する設計は、デッドロックを解消するための適切な方法ではありません。
エ: 複数レコードを更新する時の順番を決めておき、全てのバッチ処理がこれに従って処理するように設計する。
正しい。レコードのロック順序を決めておくことで、デッドロックを回避できます。すべてのバッチ処理が同じ順番でロックを取得することで、循環的なロック待機を防ぎます。
【答え】
エ: 複数レコードを更新する時の順番を決めておき、全てのバッチ処理がこれに従って処理するように設計する。
出典:平成25年度 春期 データベーススペシャリスト試験 午前II 問17