令和3年度 春期 情報処理安全確保支援士試験 午前Ⅱ 問21

複数のバッチ処理を並行して動かすとき,デッドロックの発生をできるだけ回避したい。バッチ処理の設計ガイドラインのうち,適切なものはどれか。

解答・解説

正解: エ. 複数レコードを更新するときにロックを掛ける順番を決めておき,全てのバッチ処理がこれに従って処理するように設計する。

複数のバッチ処理を並行して実行する際に、デッドロックの発生を回避するための設計に関する問題です。デッドロックとは、複数のトランザクションが互いに相手が保持している資源(ロック)の解放を待ち合い、処理が停止してしまう現象です。

デッドロックを回避するための代表的かつ有効な手法の一つに、資源をロックする順番(順序)をシステム全体で統一する方法があります。すべてのバッチ処理が決められた同じ順番でレコードにロックを掛けるように設計することで、互いにロックを待ち合う循環状態が発生しなくなり、デッドロックを防ぐことができます。したがって、エが正解です。

各選択肢の解説

  • ア:参照するだけのレコードに専有ロックを掛けると、他のトランザクションからの参照もブロックされてしまい、並行性が著しく低下します。また、不必要にロック範囲を広げることは、かえってデッドロックの発生確率を高める原因となります。
  • イ:大量データの処理をまとめて一つのトランザクションにすると、トランザクションの処理時間が長くなり、ロックを保持する期間や範囲が拡大します。これにより他の処理との競合が発生しやすくなり、デッドロックの危険性が高まります。
  • ウ:トランザクション開始時に必要なレコードを一括してロックする手法自体はデッドロック回避に有効な場合があります。しかし、「ロックに失敗した場合に、しばらく待って再度ロックを掛ける」という動作は、既に取得済みの別のレコードのロックを保持したまま待機することになるため、他のトランザクションとの間でデッドロックを引き起こす可能性が高い誤った設計です。正しくは、取得済みのロックを一度すべて解放してからリトライする必要があります。

Spineチーム