データベーススペシャリスト試験 2022年 午後103


データベースの実装と性能に関する次の記述を読んで、設問に答えよ。

 事務用品を関東地方で販売するC社は,販売管理システム (以下,システムという)に RDBMS を用いている。  
〔RDBMS の仕様〕 1.表領域  (1) テーブル及び索引のストレージ上の物理的な格納場所を,表領域という。  (2) RDBMS とストレージとの間の入出力単位を,ページという。同じページに,異なるテーブルの行が格納されることはない。
2.再編成,行の挿入  (1) テーブルを再編成することで,行を主キー順に物理的に並び替えることができる。また,再編成するとき,テーブルに空き領域の割合(既定値は 30%)を指定した場合,各ページ中に空き領域を予約することができる。  (2) INSERT 文で行を挿入するとき, RDBMSは,主キー値の並びの中で, 挿入行のキ一値に近い行が格納されているページを探し, 空き領域があればそのページに,なければ表領域の最後のページに格納する。 最後のページに空き領域がなければ、新しいページを表領域の最後に追加し, 格納する。  
〔業務の概要〕 1.顧客, 商品,倉庫  (1) 顧客は,C社の代理店、量販店などで, 顧客コードで識別する。顧客には C社から商品を届ける複数の発送先があり、顧客コードと発送先番号で識別する。  (2) 商品は,商品コードで識別する。  (3) 倉庫は,1か所である。 倉庫には複数の棚があり、一連の棚番号で識別する。商品の容積及び売行きによって,一つの棚に複数種類の商品を保管することも,同じ商品を複数の棚に保管することもある。
2.注文の入力,注文登録,在庫引当,出庫指示,出庫の業務の流れ  (1) 顧客は,C社が用意した画面から注文を希望納品日, 発送先ごとに入力し, C社の EDI システムに蓄える。 注文は,単調に増加する注文番号で識別する。注文する商品の入力順は自由で,入力後に商品の削除も同じ商品の追加もできる。  (2) C社は,毎日定刻 (9時と14時)に注文を締める。 EDI システムに蓄えた注文をバッチ処理でシステムに登録後, 在庫を引き当てる。  (3) 出庫指示書は,当日が希望納品日である注文ごとに作成し,倉庫の出庫担当者(以下,ピッカーという)を決めて, 作業開始の予定時刻までにピッカーの携帯端末に送信する。携帯端末は,棚及び商品のバーコードをスキャンする都度,システム中のオンラインプログラムに電文を送信する。  (4) 出庫は,ピッカーが出庫指示書の指示に基づいて1件の注文ごとに行う。   ① 棚の通路の入口で,携帯端末から出庫開始時刻を伝える電文を送信する。   ② 棚番号の順に進みながら, 指示された棚から指示された商品を出庫する。   ③ 商品を出庫する都度,携帯端末で棚及び商品のバーコードをスキャンし、商品を台車に積む。 ただし, 一つの棚から商品を同時に出庫できるのは1人だけである。また, 順路は1方向であるが, 通路は追い越しができる。   ④ 台車に積んだ全ての商品を、指定された段ボール箱に入れて梱包する。   ⑤ 別の携帯端末で印刷したラベルを箱に貼り, ラベルのバーコードをスキャンした後,梱包した箱を出荷担当者に渡すことで1件の注文の出庫が完了する。  
〔システムの主なテーブル〕  システムの主なテーブルのテーブル構造を図1に, 主な列の意味 制約を表1に示す。主キーにはテーブル構造に記載した列の並び順で主索引が定義されている。   データベーススペシャリスト試験(令和4年 午後I 問3 図1)
データベーススペシャリスト試験(令和4年 午後I 問3 表1)
〔システムの注文に関する主な処理〕  注文登録,在庫引当,出庫指示の各処理をバッチジョブで順に実行する。出庫実績処理は,携帯端末から電文を受信するオンラインプログラムで実行する。 バッチ及びオンラインの処理のプログラムの主な内容を, 表2に示す。
データベーススペシャリスト試験(令和4年 午後I 問3 表2)
〔ピーク日の状況と対策会議〕  注文量が特に増えたピーク日に, 朝のバッチ処理が遅延し, 出庫作業も遅延する事態が発生した。そこで,関係者が緊急に招集されて会議を開き, 次のように情報を収集し, 対策を検討した。
1.システム資源の性能に関する基本情報  次の情報から特定のシステム資源に致命的なボトルネックはないと判断した。  (1) ページングは起きておらず, CPU 使用率は25%程度であった。  (2) バッファヒット率は95%以上で高く, ストレージの入出力処理能力 (IOPS,帯域幅)には十分に余裕があった。  (3) ロック待ちによる大きな遅延は起きていなかった。
2.再編成の要否  アクセスが多かったのは “注文明細” テーブルであった。 この1年ほど行の削除は行われず,再編成も行っていないことから,時間が掛かる行の削除を行わず,直ちに再編成だけを行うことが提案されたが,この提案を採用しなかった。なぜならば,当該テーブルへの行の挿入では予約された空き領域が使われないこと,かつ空き領域の割合が既定値だったことで, 割り当てたストレージが満杯になるリスクがあると考えられたからである。
3.バッチ処理のジョブの多重化 バッチ処理のスループット向上のために, ジョブを注文番号の範囲で分割し、多重で実行することが提案されたが, デッドロックが起きるリスクがあると考えられた。そこで,どの処理とどの処理との間で,どのテーブルでデッドロックが起きるリスクがあるか, 表3のように整理し, 対策を検討した。
データベーススペシャリスト試験(令和4年 午後I 問3 表3)
4.出庫作業の遅延原因の分析  出庫作業の現場の声を聞いたところ、特定の棚にピッカーが集中し,棚の前で待ちが発生したらしいことが分かった。 そこで, 棚の前での待ち時間と棚から商品を取り出す時間の和である出庫間隔時間を分析した。 出庫間隔時間は,ピッカ 一が出庫指示書の1番目の商品を出庫する場合では当該注文の出庫開始時刻からの時間,2番目以降の商品の出庫の場合では一つ前の商品の出庫時刻からの時間である。出庫間隔時間が長かった棚と商品が何かを調べた SQL 文の例を表4に,このときの棚と商品の配置, 及びピッカーの順路を図2に示す。
データベーススペシャリスト試験(令和4年 午後I 問3 表4)
データベーススペシャリスト試験(令和4年 午後I 問3 図2)
 表4中の(x)に, B. 出庫番号, A. ピッカー ID, B. 棚番号のいずれか一つを指定することが考えられた。 分析の目的が,特定の棚の前で長い待ちが発生していたことを実証することだった場合、 (x)に(あ)を指定すると, 棚の前での待ち時間を含むが、商品の梱包及び出荷担当者への受渡しに掛かった時間が含まれてしまう。(い)を指定すると,棚の前での待ち時間が含まれないので,分析の目的を達成できない。    分析の結果,棚 3番の売行きの良い商品 S3(商品コード)の出庫で長い待ちが発生したことが分かった。 そこで,出庫作業の順路の方向を変えない条件で,多くのピッカーが同じ棚 (ここでは,棚3番)に集中しないように出庫指示を作成する対策が提案された。 しかし, この対策を適用すると, 表3中のケース2でデッドロックが起きるリスクがあると予想した。  例えば,あるピッカーに, 1番目に棚3番の商品 S3 を出庫し、2番目に棚6番の商品 S6 を出庫する指示を作成するとき,別のピッカーには, 1番目に棚(う)の商品(え)を出庫し,2番目に棚(お)の商品(か)を出庫する指示を同時に作成する場合である。

設問1(1)“2. 再編成の要否”について答えよ。

注文登録処理が “注文明細” テーブルに行を挿入するとき,再編成で予約した空き領域が使われないのはなぜか。 行の挿入順に着目し,理由を RDBMS の仕様に基づいて, 40字以内で答えよ。
模範解答
・主キーが単調に増加する番号なので過去の注文番号の近くに行を挿入しないから ・主キーの昇順に行を挿入するとき、表領域の最後のページに格納を続けるから
解説

模範解答のキーワードと論点整理

  • 単調に増加する主キー
  • 挿入時のページ選択
  • 常に「表領域の最後のページ」に格納される

解答が正しい理由の論理展開

  1. RDBMSの仕様(原文引用)
    「INSERT 文で行を挿入するとき, RDBMSは, 主キー値の並びの中で, 挿入行のキ一値に近い行が格納されているページを探し, 空き領域があればそのページに, なければ表領域の最後のページに格納する。」
  2. 注文明細テーブルの主キーである注文番号は「単調に増加する注文番号で識別する」ため、
    新しい注文番号は常に既存のすべての行より大きく、「近い行」を持つページは表領域の最後のページになります。
  3. したがって、再編成で他のページに空き領域を30%予約しても、その予約領域へは挿入されず、
    常に末尾のページに格納されるため、予約空き領域が使われません。

誤りやすいポイント

  • 「空き領域を予約している=必ず使われる」と考える誤解
    → 挿入時は主キー順の“近さ”でページを選ぶため、末尾への追加入力で予約領域は無視される。
  • 後半の「空き領域がなければ新ページを追加」という文だけを見て、そちらに固執しない

試験対策のまとめ

  • INSERT時のページ選択:主キー値に近いページ→空き有→挿入、無→最後のページ
  • 再編成の空き領域予約(fill-factor):挿入順序とキー分布次第で使われないことがある
  • 主キーの性質(単調増加 vs ランダム割り当て)が、データ配置・性能に与える影響を押さえる
  • 問題文の「仕様」を常に原文で確認し、個別の処理フローと結び付ける練習をする

設問1(2)“2. 再編成の要否”について答えよ。

行の削除を行わず、直ちに再編成だけを行うと, ストレージが満杯になるリスクがあるのはなぜか。 前回の再編成の時期及び空き領域の割合に着目し,理由を RDBMS の仕様に基づいて, 40字以内で答えよ。
模範解答
再編成後に追加した各ページで既定の空き領域分のページが増えるから
解説

キーワード・論点

  • 再編成時の空き領域予約(既定値は 30%)
  • 行の挿入時に「予約空き領域」が使われない
  • 各ページに無駄な空きが残る → ストレージ消費が増大 → 表領域満杯リスク

解説

  1. 【問題文】の仕様から、再編成時の挙動を確認します。
    「再編成するとき,テーブルに空き領域の割合(既定値は 30%)を指定した場合,各ページ中に空き領域を予約することができる。」
  2. しかし、
    「当該テーブルへの行の挿入では予約された空き領域が使われないこと」
    とあるとおり、新規行の追加では再編成で予約した空き領域を利用せず、常に新規ページを割り当てる挙動になります。
  3. その結果、各ページに「既定の空き領域分(30%相当)」が常に残るため、実際に格納できるデータ量に対してページ数が無駄に増加し、表領域が早期に満杯になるリスクがあります。

受験上の注意ポイント

  • 空き領域予約=必ず使われると誤解しやすいが、本問では「予約空き領域を利用しない」仕様を押さえる。
  • 再編成後の空き領域設定は、実際の挿入アルゴリズムによって効果が変わる点を理解する。
  • 「表領域が満杯になるリスク」は、ただ行数が増えるからではなく、1ページ当たりの有効利用率が低下する点がポイント。

試験対策まとめ

  • RDBMSの 再編成空き領域割合 設定の基本仕様
  • ページ単位の 挿入アルゴリズム空き領域の使用可否
  • 表領域の物理拡張リスク:ページあたり有効データ量の低下による容量増大への影響を押さえる。

設問2(1)”3. バッチ処理のジョブの多重化”について答えよ。

表3中の(a)〜(c)に入れる適切な理由を,それぞれ 30 字以内で答えよ。ここで,在庫は適正に管理され, 欠品はないものとする。
模範解答
a:異なる商品の“在庫”を逆順で更新することがあり得るから b:“棚別在庫”を常に主キーの順で更新しているから c:異なるジョブが同じ注文の明細行を更新することはないから
解説

キーワード・論点整理

  • デッドロックの基本要因:異なるトランザクションが同じテーブルの行に対して「逆順にロック取得」すると発生
  • 在庫引当バッチの更新順序
    ‐ 「注文登録」「在庫引当」「出庫指示」のうち、在庫引当
    「注文状態が未引当の 注文明細 をキー順に読み込み、その順で 在庫 を更新」
  • 出庫指示バッチの更新順序
    出庫指示
    出庫指示 をキー順に読み込み、その順で 棚別在庫 を更新」
  • 注文明細テーブルへの更新範囲
    ‐ 在庫引当は「注文状態が未引当の明細行」を、
    ‐ 出庫指示は「注文状態が引当済の明細行」をそれぞれ独立に更新

(a)「在庫引当/在庫引当」リスクの理由

模範解答
異なる商品の“在庫”を逆順で更新することがあり得るから
論理展開
  1. 在庫引当
    「注文状態が未引当の 注文明細 をキー順に読み込み、その順で 在庫 を更新し…」
    とある。
  2. バッチを注文番号の範囲で分割すると、各ジョブが対象とする 注文明細 のキー順はそれぞれ異なる。
  3. 結果として、ジョブA が「商品X → 商品Y」の順で 在庫 を更新し、ジョブB が「商品Y → 商品X」の順で更新する可能性がある。
  4. このとき、ジョブA が先に商品X をロックしジョブB が先に商品Y をロックした後、逆の商品でロックを取りに行くと、**ロック奪い合い(デッドロック)**が発生する。

(b)「出庫指示/出庫指示」リスクの理由

模範解答
“棚別在庫”を常に主キーの順で更新しているから
論理展開
  1. 出庫指示
    出庫指示 をキー順に読み込み、その順で 棚別在庫 を更新し…」
  2. どのピッカー割り当てジョブでも、必ず同じ主キー順(出庫番号→棚番号→商品コードなど)で 棚別在庫 を更新する。
  3. 複数ジョブが同時に並列実行しても、更新対象行のロック取得順は全ジョブで一貫して同一順序となるため、ロック競合は起きてもデッドロックにはならない。

(c)「在庫引当/出庫指示」リスクの理由

模範解答
異なるジョブが同じ注文の明細行を更新することはないから
論理展開
  1. 在庫引当は「注文状態が未引当の 注文明細」を対象
  2. 出庫指示は「注文状態が引当済の 注文明細」を対象
  3. 両者は更新する明細行の状態が異なるため、同一行を同時に更新することが絶対にない
  4. したがって、注文明細 テーブルを巡る排他ロックの奪い合い自体が発生せず、デッドロックは起きない

受験上の注意ポイント

  • 更新順序の一貫性
    複数ジョブで同一テーブルを更新するときは「常に同じキー順で更新する」ことでデッドロックを回避できる。
  • ロック対象の重複回避
    状態遷移(例:未引当→引当済→出庫指示済)のように、更新対象を段階的に分けると同一行更新の競合を防ぎやすい。
  • ジョブ分割時の副作用
    キー範囲でジョブを多重化する際は、各バッチの読み込み順序・更新順序の逆転有無を必ず確認すること。
  • SQLのキー順指定
    明示的に ORDER BY やウィンドウ関数でキー順を保証しないと、RDBMS内部のアクセス順によっては思わぬロック競合を招く。
これらを押さえておくと、性能チューニングや並列バッチ設計におけるデッドロック対策がスムーズになります。

設問2(2)”3. バッチ処理のジョブの多重化”について答えよ。

表3中のケース1のリスクを回避するために,注文登録処理又は在庫引当処理のいずれかのプログラムを変更したい。 どちらかの処理を選び,選んだ処理の処理名を答え、プログラムの変更内容を具体的に 30 字以内で答えよ。た だし,コミット単位と ISOLATION レベルを変更しないこと。
模範解答
処理名:注文登録 変更内容:・“注文明細”に行を商品コードの順に登録する。      ・商品コードの順に注文明細番号を付与する。
処理名:在庫引当 変更内容:・“在庫”の行を商品コードの順に更新する。
解説

模範解答の整理

以下のいずれかを選択します。
処理名変更内容(30字以内)
注文登録“注文明細”に行を商品コードの順に登録し、注文明細番号を付与
在庫引当“在庫”の行を商品コードの順に更新する

キーワード・論点整理

  • デッドロック
    同一「在庫」テーブルの複数行を、複数ジョブが異なる順序で更新しようとして発生
  • ロック取得順序の一貫性
    並列実行するジョブ間で更新対象行の順序をそろえる必要がある
  • 注文明細の主キー順
    「在庫引当」処理は
    “注文状態が未引当の "注文明細" をキー順に読み込み,その順で "在庫" を更新”
    とあるため、注文明細番号の付与順が更新順を決める
  • 回避策
    商品コードでソートされた順序で更新(あるいは挿入)するように変更し、全ジョブで同一順序を担保

解答の論理的根拠

  1. 表3ケース1では,
    処理名処理名テーブルリスクの有無
    在庫引当在庫引当在庫ある
    とあり,
    (a)
    同一テーブルの行を異なる順序で更新するとデッドロック
  2. 在庫引当処理の流れ(問題文引用):
    “注文状態が未引当の "注文明細" をキー順に読み込み,
    その順で "在庫" を更新し,…”
    注文明細番号の割り当て順がキー順になるため,
    並列ジョブ間で異なる製品コードの順序で「在庫」行をロックし,
    相互に待ち状態となりデッドロックを起こす。
  3. そこで,
    • 注文明細を あらかじめ商品コード順に登録(注文登録処理の変更)
    • 注文明細番号順=商品コード順
    • 在庫引当は注文明細のキー順(=商品コード順)に更新
      または
    • 在庫引当処理で “在庫”を更新する際に商品コード順に並び替え
    • 並列ジョブ間で在庫行の更新順をそろえ,デッドロック回避

誤りやすいポイント

  • 「コミット単位」「ISOLATION レベル」には手を付けられない
  • 注文明細番号やPKのキー順≠商品コード順のままでは順序がバラバラ
  • 並び替え忘れ(ORDER BY商品コード)や副問い合わせでインデックス順に依存すると危険
  • ジョブ分割時,読み込む順序と更新する順序は必ず設計で制御する

試験対策:覚えておくべきポイント

  1. デッドロック回避の基本
    • 複数リソースをロックするときは,全ジョブで同一の順序でロック取得
  2. 並列バッチ処理
    • ジョブ分割するとき,アクセス順序が狂うとデッドロックの原因に
  3. RDBMS の入出力順序
    • 主キー順・INDEX順は明示的に ORDER BY しないと保証されない
  4. 小問では「コミット単位」「Isolation Level」は変更不可
    • 別方法(ソート順制御)でデッドロック回避を検討することが重要

設問3(1)4. 出庫作業の遅延原因の分析について答えよ。

本文中の(あ)〜(か) に入れる適切な字句を答えよ。
模範解答
あ:A.ピッカーID い:B.棚番号 う:6番 え:S6 お:3番 か:S3
解説

キーワード・論点整理

項目キーワード・論点
小問(あ)LAG関数の PARTITION BY に指定する列
小問(い)同上
小問(う)出庫指示時に複数スレッドで同時に更新する棚の番号順序
小問(え)小問(う)で指定する商品の商品コード
小問(お)他スレッドと逆順で更新させる棚の番号
小問(か)小問(お)で指定する商品の商品コード

解答解説

(あ)(い) LAG関数による「出庫間隔時間」算出のパーティションキー

SQLの要点は以下の部分です。
B.出庫時刻 - COALESCE(
  LAG(B.出庫時刻) OVER (PARTITION BY (x) ORDER BY B.出庫時刻),
  A.出庫開始時刻
) AS 出庫間隔時間
分析の目的は「同一出庫作業内で、各棚の前で発生した待ち時間+取り出し時間」を求めることです。
PARTITION BYに何を指定するかで、LAGが参照する「前行」の範囲が変わります。
  1. PARTITION BY ピッカーID
    • 同一ピッカー全体の出庫指示を時刻順に並べるため、ある注文の最後の商品から次の注文の最初の商品まで含む。
    • したがって「商品の梱包及び出荷担当者への受渡しに掛かった時間」も含まれてしまう。
    • 問題文:「(あ)を指定すると,棚の前での待ち時間を含むが、商品の梱包及び出荷担当者への受渡しに掛かった時間が含まれてしまう。」
  2. PARTITION BY 棚番号
    • 同一棚における複数の出庫指示をまとめて処理するため、同一注文内で複数回ピックする場合でも「前回の同じ棚での出庫時刻」と比較されてしまい、同一注文内で連続する商品の前後比較(=待ち時間+取り出し時間)が行えない。
    • 問題文:「(い)を指定すると,棚の前での待ち時間が含まれないので,分析の目的を達成できない。」
したがって
  • (あ)=「ピッカーID」
  • (い)=「棚番号」
が適切です。

(う)(え)(お)(か) 出庫指示バッチの多重化時のデッドロックリスク

背景整理
  • 出庫指示バッチは,出庫指示を「キー順に読み込み,その順で棚別在庫を更新」します。
  • 「キー順」とは,出庫指示テーブルの主キー(出庫番号,棚番号,商品コード…)の並び順です。
  • 典型的には「同一出庫(出庫番号)内で,棚番号の昇順」に更新を行うため, 単一スレッド時は必ず昇順でロック取得し,デッドロックは発生しません(表3 ケース2)。
リスク発生の例
  1. スレッドA:
    • 1件目 → 棚3番の商品 S3 を出庫
    • 2件目 → 棚6番の商品 S6 を出庫
      (昇順で 3 → 6 の順に更新)
  2. スレッドB(同時実行):
    • 1件目 → 棚6番の商品 S6 を出庫
    • 2件目 → 棚3番の商品 S3 を出庫
      (降順で 6 → 3 の順に更新)
このとき両スレッドは同じ棚別在庫テーブルのレコードをロックしますが,
Aは「3 → 6」の順,Bは「6 → 3」の順でロックを取得しようとするため,
Aが棚3番ロック後に棚6番ロック待ち,Bが棚6番ロック後に棚3番ロック待ちとなり,
デッドロックが発生します。
したがって,例示された同時実行ケースでは
  • (う)=「6番」
  • (え)=「S6」
  • (お)=「3番」
  • (か)=「S3」
となります。

選択肢・誤りやすいポイント

  1. 「PARTITION BY 出庫番号」を選んでしまう誤り
    • 出庫番号ごとに区切ると,1つの出庫内の連続比較は可能ですが,複数の出庫(注文)をまたぐ分析ができないため「同一ピッカー全体の動きを比較したいのか」「同一出庫内の待ち時間を比較したいのか」を混同しやすい。
  2. 棚番号でパーティションを切ると「同一注文内」で棚番号が重複していない限り,2行目以降はすべて前回比較対象が他注文の同じ棚となり,まったく異なる間隔(通路移動時間など)になってしまう。
  3. デッドロックの発生条件
    • 更新対象(ここでは棚別在庫テーブル)に対し,異なるスレッドが逆順でロックを取得しようとするとき発生する。
    • 「更新順序を常に昇順に統一」すれば防げるが,出庫指示の順路制御などで任意の順序にすると逆順ロックが起きる。

試験対策まとめ

  • LAG関数を用いた出庫間隔時間の分析では,PARTITION BY のキー選択が「同一単位(ピッカー単位 or 出庫単位 or 棚単位)」の行をどのようにグループ化するかを意識する。
  • デッドロックは「同じリソースを異なる順序でロックしようとする」ことで発生する。バッチを多重化するときは,複数ジョブ間でテーブルアクセスの順序をそろえることが重要。
  • 出庫業務においては「出庫番号」「ピッカーID」「棚番号」の3つのキーの組み合わせで分析単位やロック単位が変わる点を押さえておくこと。

設問3(2)4. 出庫作業の遅延原因の分析について答えよ。

下線の対策を適用した場合, 表3中のケース2で起きると予想したデッドロックを回避するために, 出庫指示処理のプログラムをどのように変更すべきか。 具体的に 40 字以内で答えよ。 ただし, コミット単位と ISOLATION レベルを変更しないこと。
模範解答
・“出庫指示”の読み込み順を出庫番号,商品コード,棚番号の順に変更する。 ・“棚別在庫”の行を商品コード,棚番号の順に更新する。
解説

1. 模範解答のキーワード・論点整理

  • 一貫した行ロック順序によるデッドロック回避
  • “出庫指示”テーブルの読み込み順序変更
  • “棚別在庫”テーブルの行更新順序変更

2. 解答が導かれる理由

(1)問題文からのポイント

  • 問題文中の「出庫指示」処理では、以下のように書かれています。
    ・“出庫指示”をキー順に読み込み、
    ・“棚別在庫”を更新し、…コミットする。
  • “出庫指示”の主キー順は(出庫番号, 棚番号, 商品コード)
  • “棚別在庫”の主キー順は(棚番号, 商品コード)
これにより、複数ジョブを並列に実行すると
ジョブA:ロック順(棚3→棚6)
ジョブB:ロック順(棚202→棚6)
と、スレッド間でロック対象の行順序が逆転するためにデッドロックが発生します。

(2)解答の対策内容

デッドロックを防ぐには、全ジョブが「同じ順序」で行ロックを取ることが必須です。
そこで、
  1. “出庫指示”の読み込みキーを
    →(出庫番号, 商品コード, 棚番号)
  2. “棚別在庫”の行更新キーを
    →(商品コード, 棚番号)
    にそれぞれ変更し、
    すべてのジョブが「同一の (出庫番号→商品コード→棚番号) の順」でロックを取得するようにします。
    こうすることで、どのジョブ/どのピッカー指示でも商品コードごとにまとめて棚番号の昇順でロックが掛かり、順序が逆転することがなくなり、デッドロックを回避できます。

3. 受験者が誤りやすいポイント

  • 「読み込み順」と「更新順」の両方をそろえる必要があること
  • 主キーの元の順序(出庫番号→棚番号→商品コード)をそのまま逆にすればよいわけではなく、「商品コード」を先に出すこと
  • コミット単位やISOLATIONレベルは変更禁止という条件を忘れないこと

4. 試験対策として覚えておくべき知識

  • 【デッドロック回避の基本】
    複数のバッチやトランザクションが並列に同一テーブル/行を更新する場合、必ず「同一のキー順」でアクセス(ロック)すること。
  • 【RDBMSの行ロック順序】
    主キーや索引のキー順で行をロックする仕組みを理解し、必要に応じて明示的にORDER BY句やソート順を指定できるようにする。
  • 【バッチの多重化リスク】
    ジョブ分割によるスループット向上策では、デッドロックだけでなくコミット粒度や索引の選択が性能や整合性に与える影響にも注意すること。
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ