DBデータベーススペシャリスト試験 午前Ⅱ

平成25年度春期 データベーススペシャリスト 午前Ⅱ 問17

問題文と選択肢を読んで答えを考えてから、下の「正解と解説を見る」で確認しましょう。

問題

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

選択肢

  1. ア
    参照するレコードにも,専有ロックをかけるように設計する。
  2. イ
    大量データに同じ処理を行うバッチ処理は,まとめて一つのトランザクションとして処理するように設計する。
  3. ウ
    トランザクション開始直後に,必要なレコード全てに専有ロックをかける。ロックに失敗したレコードには,しばらく待って再度ロックをかけるように設計する。
  4. エ
    複数レコードを更新するときの順番を決めておき,全てのバッチ処理がこれに従って処理するように設計する。
解き方のヒントを見る

同時実行制御を整理する視点

複数の処理が同じデータを扱う場面では、処理の順序、待ち状態、参照と更新の関係を時系列で整理し、互いの操作がどのように影響し合うかを確認する視点が重要です。まずは一つの流れとして追ってみましょう。

この問題で問われていること

確認する観点は、各処理がデータを参照・変更するタイミングと、その間に別の処理が割り込む可能性です。操作を時系列に並べ、競合が起こり得る箇所だけに注目して整理しましょう。

視点

同時実行の検討では、処理ごとの対象データ、操作の種類、開始と終了の順序、他処理との重なりを分けて書き出します。そのうえで、各時点でどの情報が読み書きされているかを比較し、競合という言葉が示す関係を丁寧に確認します。

確認ポイント

  • 各処理の参照・変更対象を区別する
  • 操作の開始・終了と重なりを時系列で整理する
  • 別処理の介入による影響範囲を確認する
正解と解説を見る

正解

エ

解説

デッドロックは、複数のバッチ処理が異なる順序でレコードをロックし、互いに相手のロック解除を待つことで発生しやすい。更新対象の処理順を統一すれば、待機関係の循環を避けやすくなる。

理由

複数の処理が同じレコード群を更新する場合、処理ごとにロックを取得する順番が違うと、互いにロックを保持したまま相手のロックを待つ状態になり得る。更新順序を統一すると、このような循環待機をできるだけ防止できる。

比較

参照だけのレコードに専有ロックをかけたり、処理を巨大な一つのトランザクションにまとめたりすると、ロック競合や保持時間が増えやすい。また、開始直後にロックを試みて待つだけでは、取得順序の不統一による相互待機を解消できない。

選択肢ア

これは不正解だよ。参照するだけのレコードに専有ロックをかけると、更新を必要としない処理まで排他的に待たせることになる。ロック対象や保持時間が増えて競合が起こりやすくなり、デッドロックを避けるための一般的な設計方針とはいえない。

選択肢イ

これは不正解だよ。大量データの処理を一つのトランザクションにまとめると、処理完了までロックを長時間保持しやすい。その間に他のバッチ処理が待たされる範囲も広がり、競合やデッドロックの発生機会を増やすため、適切な指針ではない。

選択肢ウ

これは不正解だよ。必要なレコードを早い段階でロックする考え方だけでは、複数のバッチ処理が異なる順番でロックを取得する問題を解決できない。取得できないレコードを待って再試行しても、互いに待つ関係が残ればデッドロックにつながる。

選択肢エ(正解)

これは正解だよ。複数レコードを更新する順番をあらかじめ統一し、全てのバッチ処理が同じ順序でロックを取得するようにすると、処理同士が互いのロック解除を待つ循環待機を避けやすい。したがって、デッドロックをできるだけ回避する設計として適切である。

学習のポイント

ロック取得順序を統一して相互待機を防ぐ設計を理解する。

出典:独立行政法人 情報処理推進機構(IPA)平成25年度春期 データベーススペシャリスト試験 午前Ⅱ 問17(公式資料:問題冊子(PDF) / 解答例)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針