令和4年度 秋期 午前Ⅱ 問13
トランザクション処理
デッドロックに関する問題
複数のバッチ処理を並行して動かすとき,デッドロックの発生をできるだけ回避したい。バッチ処理の設計ガイドラインのうち,適切なものはどれか。
- ア参照するレコードにも,専有ロックを掛けるように設計する。
- イ大量データに同じ処理を行うバッチ処理は,まとめて一つのトランザクションとして処理するように設計する。
- ウトランザクション開始直後に,必要なレコード全てに専有ロックを掛ける。ロックに失敗したレコードには,しばらく待って再度ロックを掛けるように設計する。
- エ複数レコードを更新するときにロックを掛ける順番を決めておき,全てのバッチ処理がこれに従って処理するように設計する。
答えと解説を見る
✓ これが正解エ複数レコードを更新するときにロックを掛ける順番を決めておき,全てのバッチ処理がこれに従って処理するように設計する。
解説
ロックを掛ける順番を全処理でそろえると、待ちが輪にならず回避できます。
デッドロックは、二つ以上の処理が互いに相手の持つロックの解放を待ち合い、どちらも先へ進めなくなる状態です。典型的には、処理1がレコード甲、処理2がレコード乙をロックしたあと、処理1が乙を、処理2が甲を求めるときに起こります。ここで、複数のレコードを更新するときのロックの順番を全てのバッチ処理で同じに決めておけば、どの処理も甲の次に乙という同じ順でロックを求めます。すると、乙を持ったまま甲を待つ処理が生まれず、待ちが輪になることがありません。これがデッドロックを避ける設計として適切です。待ちの関係が輪にならない仕組みかどうかを軸にすると、他のガイドラインとの違いが分かります。
ほかの選択肢はなぜ違うのか
- ア参照するレコードにも,専有ロックを掛ける…:参照するだけのレコードにも専有ロックを掛けると、本来は同時に読めるはずの処理まで互いを待たせることになります。ロックの衝突が増えるため、デッドロックが起こる機会もかえって増えます。
- イ大量データに同じ処理を行うバッチ処理は,…:大量データへの処理を一つのトランザクションにまとめると、多くのレコードのロックを長い時間持ち続けることになります。他のバッチ処理と競合する範囲と時間が広がり、デッドロックの起こりやすさは増します。
- ウトランザクション開始直後に,必要なレコー…:最初に全てのレコードへ専有ロックを掛けようとしても、失敗したレコードを待って再試行する間、既に得たロックは持ったままです。その間に他の処理も同じように待てば、互いに待ち合う状態から抜け出せなくなります。
この問題の用語
- トランザクションデータベースへの一連の処理をひとまとめにした単位のこと。途中で失敗すると開始前の状態へ戻され、中途半端な更新が残りません。
出典:令和4年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問13
同じ用語が出る問題
- 令和7年度 秋期 午前Ⅱ 問18:ブロックチェーンに関する問題(トランザクション)
- 令和7年度 秋期 午前Ⅱ 問17:デッドロックに関する問題(トランザクション)
- 令和7年度 秋期 午前Ⅱ 問16(トランザクション)
- 令和7年度 秋期 午前Ⅱ 問15:隔離性水準に関する問題(トランザクション)
- 令和7年度 秋期 午前Ⅱ 問14:べき等に関する問題(トランザクション)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)