デッドロックの回避|情報処理安全確保支援士試験 令和3年 春期午前Ⅱ試験 問21

出典:令和3年春期 午前Ⅱ 問21 分野:データベース / トランザクション処理
複数のバッチ処理を並行して動かすとき,デッドロックの発生をできるだけ回避したい。バッチ処理の設計ガイドラインのうち,適切なものはどれか。
  • ア:参照するレコードにも,専有ロックを掛けるように設計する。
  • イ:大量データに同じ処理を行うバッチ処理は,まとめて一つのトランザクションとして処理するように設計する。
  • ウ:トランザクション開始直後に,必要なレコード全てに専有ロックを掛ける。ロックに失敗したレコードには,しばらく待って再度ロックを掛けるように設計する。
  • エ:複数レコードを更新するときの順番を決めておき,全てのバッチ処理がこれに従って処理するように設計する。
解説

デッドロックは、複数の処理が互いに相手のロック解放を待ち合ってしまい、処理が進まなくなる状態です。

複数のバッチ処理で複数レコードを更新する場合、更新する順番を全ての処理で統一しておくと、互いに逆順でロックを取り合う状況を避けやすくなります。そのため、デッドロックの発生を回避する設計として有効です。

したがって、が適切です。

❌他選択肢が誤りの理由
ア:参照するレコードにも,専有ロックを掛けるように設計する。
⇒参照だけのレコードにまで専有ロックを掛けると、他の処理の待ち時間が増え、デッドロックや性能低下の原因になりやすくなります。必要以上に強いロックを掛ける設計は適切ではありません。
イ:大量データに同じ処理を行うバッチ処理は,まとめて一つのトランザクションとして処理するように設計する。
⇒大量データを一つの大きなトランザクションで処理すると、ロックを長時間保持しやすくなります。その結果、他のバッチ処理との競合が増え、デッドロックが発生しやすくなるため、適切ではありません。
ウ:トランザクション開始直後に,必要なレコード全てに専有ロックを掛ける。ロックに失敗したレコードには,しばらく待って再度ロックを掛けるように設計する。
⇒開始直後に全てのレコードへ専有ロックを掛けると、ロック範囲が広くなり、他の処理を待たせやすくなります。また、ロック失敗時に待って再試行するだけでは、互いに待ち合う状態を根本的に避けられません。複数レコードを扱う場合は、ロック取得順序を統一することが重要です。
TSUNAGARU-ADVICE

まず押さえたいこと

デッドロックを避けるには、複数の処理が同じ資源を異なる順番でロックしないようにすることが重要です。複数レコードを更新する場合は、全てのバッチ処理で同じ順番にロック・更新するように設計します。

迷ったときの判断軸

参照だけのレコードに専有ロックを掛けたり、大量データを一つの大きなトランザクションで処理したりすると、ロック範囲やロック時間が長くなり、デッドロックや待ちが発生しやすくなります。デッドロック対策では、ロックの順番を統一することが基本です。

科目Bにつなげるために

科目Bでは、複数の処理がどの順番でレコードを更新しているかを読み取り、デッドロックの原因や対策を考える問題が出ることがあります。処理Aは1→2、処理Bは2→1のように逆順でロックすると危険なので、全処理で同じ更新順序にそろえる視点を持ちましょう。※