令和4年度 秋期 データベーススペシャリスト試験 午前II 問13
複数のバッチ処理を並行して動かすとき,デッドロックの発生をできるだけ回避したい。バッチ処理の設計ガイドラインのうち,適切なものはどれか。
解答・解説
正解: エ. 複数レコードを更新するときにロックを掛ける順番を決めておき,全てのバッチ処理がこれに従って処理するように設計する。
複数のトランザクションが互いに相手がロックしている資源の解放を待ち合い、処理が完全に停止してしまう状態をデッドロックと呼びます。
デッドロックを回避・予防するための代表的な設計手法の一つが、すべての処理において資源(レコードなど)にロックを掛ける順番を統一することです。順番をルール化することで、互いにロックを要求し合う「循環待ち」の状態が発生しなくなります。したがって、選択肢エが適切なガイドラインとなります。
各選択肢の解説
- ア:参照処理には通常、他からの参照を妨げない共有ロックを用います。参照時に専有ロック(排他ロック)を掛けると、並行処理能力が著しく低下し、かえって待ち状態を増やす原因になります。
- イ:大量のデータをまとめて一つのトランザクションにすると、多くのレコードを長時間ロックすることになります。これにより他の処理が待たされる時間が増え、結果的にデッドロックの発生確率が高まります。適度な単位で分割して処理(コミット)するのが一般的です。
- ウ:ロックに失敗した際に、すでに取得済みのロックを保持したまま待ち続けると、デッドロックを引き起こす原因になります。ロックに失敗した場合は、一度自身の処理をロールバックしてすべてのロックを解放し、一定時間後に最初からやり直すのが適切な対処法です。
- エ:正解。更新対象のレコードに対してロックを掛ける順番をあらかじめ決めておき、全バッチ処理でそれを順守することでデッドロックを回避できます。