データベーススペシャリスト試験 2022年 午後1 問03
データベースの実装と性能に関する次の記述を読んで、設問に答えよ。
事務用品を関東地方で販売する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に示す。主キーにはテーブル構造に記載した列の並び順で主索引が定義されている。



〔システムの注文に関する主な処理〕
注文登録、在庫引当、出庫指示の各処理をバッチジョブで順に実行する。出庫実績処理は、携帯端末から電文を受信するオンラインプログラムで実行する。 バッチ及びオンラインの処理のプログラムの主な内容を、表2に示す。

〔ピーク日の状況と対策会議〕
注文量が特に増えたピーク日に、朝のバッチ処理が遅延し、出庫作業も遅延する事態が発生した。そこで、関係者が緊急に招集されて会議を開き、次のように情報を収集し、対策を検討した。
1.システム資源の性能に関する基本情報
次の情報から特定のシステム資源に致命的なボトルネックはないと判断した。
(1) ページングは起きておらず、CPU 使用率は25%程度であった。
(2) バッファヒット率は95%以上で高く、ストレージの入出力処理能力 (IOPS,帯域幅)には十分に余裕があった。
(3) ロック待ちによる大きな遅延は起きていなかった。
2.再編成の要否
アクセスが多かったのは “注文明細” テーブルであった。 この1年ほど行の削除は行われず、再編成も行っていないことから、時間が掛かる行の削除を行わず、直ちに再編成だけを行うことが提案されたが、この提案を採用しなかった。なぜならば、当該テーブルへの行の挿入では予約された空き領域が使われないこと、かつ空き領域の割合が既定値だったことで、割り当てたストレージが満杯になるリスクがあると考えられたからである。
3.バッチ処理のジョブの多重化
バッチ処理のスループット向上のために、ジョブを注文番号の範囲で分割し、多重で実行することが提案されたが、デッドロックが起きるリスクがあると考えられた。そこで、どの処理とどの処理との間で、どのテーブルでデッドロックが起きるリスクがあるか、表3のように整理し、対策を検討した。

4.出庫作業の遅延原因の分析
出庫作業の現場の声を聞いたところ、特定の棚にピッカーが集中し、棚の前で待ちが発生したらしいことが分かった。 そこで、棚の前での待ち時間と棚から商品を取り出す時間の和である出庫間隔時間を分析した。 出庫間隔時間は、ピッカ
一が出庫指示書の1番目の商品を出庫する場合では当該注文の出庫開始時刻からの時間,2番目以降の商品の出庫の場合では一つ前の商品の出庫時刻からの時間である。出庫間隔時間が長かった棚と商品が何かを調べた SQL 文の例を表4に、このときの棚と商品の配置、及びピッカーの順路を図2に示す。


表4中の(x)に、B. 出庫番号、A. ピッカー ID, B. 棚番号のいずれか一つを指定することが考えられた。 分析の目的が、特定の棚の前で長い待ちが発生していたことを実証することだった場合、
(x)に(あ)を指定すると、棚の前での待ち時間を含むが、商品の梱包及び出荷担当者への受渡しに掛かった時間が含まれてしまう。(い)を指定すると、棚の前での待ち時間が含まれないので、分析の目的を達成できない。
分析の結果、棚 3番の売行きの良い商品 S3(商品コード)の出庫で長い待ちが発生したことが分かった。 そこで、出庫作業の順路の方向を変えない条件で、多くのピッカーが同じ棚 (ここでは、棚3番)に集中しないように出庫指示を作成する対策が提案された。 しかし、この対策を適用すると、表3中のケース2でデッドロックが起きるリスクがあると予想した。
例えば、あるピッカーに、1番目に棚3番の商品 S3 を出庫し、2番目に棚6番の商品 S6 を出庫する指示を作成するとき、別のピッカーには、1番目に棚(う)の商品(え)を出庫し,2番目に棚(お)の商品(か)を出庫する指示を同時に作成する場合である。
設問1:“2. 再編成の要否”について答えよ。
(1)注文登録処理が “注文明細” テーブルに行を挿入するとき、再編成で予約した空き領域が使われないのはなぜか。 行の挿入順に着目し、理由を RDBMS の仕様に基づいて、40字以内で答えよ。
模範解答
・主キーが単調に増加する番号なので過去の注文番号の近くに行を挿入しないから
・主キーの昇順に行を挿入するとき、表領域の最後のページに格納を続けるから
解説
解答の論理構成
- 行の挿入順の事実
- 問題文より「注文は、単調に増加する注文番号で識別する。」
⇒注文番号
が主キーの先頭列であり、値は昇順に連続発生。
- 問題文より「注文は、単調に増加する注文番号で識別する。」
- RDBMS の格納アルゴリズム
- 仕様「挿入行のキー値に近い行が格納されているページを探し…空き領域がなければ表領域の最後のページに格納する。」
⇒ 新しい注文番号
は既存の最大値より大きいので、探索結果は必ず“最後尾ページ”。
- 仕様「挿入行のキー値に近い行が格納されているページを探し…空き領域がなければ表領域の最後のページに格納する。」
- 再編成で確保した空き領域の位置
- 再編成は各ページに「空き領域の割合(既定値は 30%)」を作るが、それは過去の注文番号が並ぶ途中ページ。
- 結論導出
- 挿入先が常に最後尾ページで固定されるため、中間ページの空き領域は参照されず、「再編成で予約した空き領域が使われない」。
誤りやすいポイント
- 「空き領域が使われない=再編成は無意味」と断定する。実際は読み込み効率改善など別効果がある。
- ページ単位で異テーブル混在不可(仕様1(2))を忘れ、空き領域は他テーブル挿入に使えると誤解する。
- INSERT がランダムに行われると想定し、途中ページへ挿入されるケースを過大評価する。
FAQ
Q: 再編成で空き領域を 0% に設定すれば問題は解決しますか?
A: 挿入先は最終ページ固定なので空き領域割合を変えても効果は限定的です。むしろ途中更新で行長が伸びる場合のページ分割が発生しやすくなります。
A: 挿入先は最終ページ固定なので空き領域割合を変えても効果は限定的です。むしろ途中更新で行長が伸びる場合のページ分割が発生しやすくなります。
Q: 主キーが日付+連番など増分でない場合はどうなりますか?
A: ランダム挿入が増え、途中ページの空き領域を探す機会が増えるため、再編成で確保した空き領域が有効活用されやすくなります。
A: ランダム挿入が増え、途中ページの空き領域を探す機会が増えるため、再編成で確保した空き領域が有効活用されやすくなります。
Q: オンライン再編成を採用すれば空き領域問題は回避できますか?
A: オンライン/オフラインの方式に関係なく空き領域の位置は同じです。回避策はパーティション分割やテーブル拡張領域のチューニングが中心となります。
A: オンライン/オフラインの方式に関係なく空き領域の位置は同じです。回避策はパーティション分割やテーブル拡張領域のチューニングが中心となります。
関連キーワード: 主キー、ページ、空き領域、INSERT, 物理配置
設問1:“2. 再編成の要否”について答えよ。
(2)行の削除を行わず、直ちに再編成だけを行うと、ストレージが満杯になるリスクがあるのはなぜか。 前回の再編成の時期及び空き領域の割合に着目し、理由を RDBMS の仕様に基づいて、40字以内で答えよ。
模範解答
再編成後に追加した各ページで既定の空き領域分のページが増えるから
解説
解答の論理構成
- 前提確認
- 最後の再編成から「この1年ほど」経過しており、その間に大量の INSERT によりページが増加。
- RDBMS の予約空き領域の仕様
- 再編成時に「空き領域の割合(既定値は 30%)」をページ内に確保。
- 予約空き領域が利用されない理由
- 挿入時は「空き領域があればそのページに」だが、予約空き領域は使用対象外なので実際には使われず新ページが追加され続ける。
- 今再編成すると…
- 既存ページにも新規ページにも再び 30% の未使用領域が生まれ、総ページ数がさらに増加。
- 結論
- 無駄なページ増加により「割り当てたストレージが満杯になるリスク」が発生。
誤りやすいポイント
- 予約空き領域を「将来の INSERT で自動的に使われる」と誤解する。
- 「行の削除を行わず」とあるので空きページが無いと判断しがちだが、実際はページ内に予約空き領域が存在。
- 再編成=圧縮と短絡的に考え、ストレージ節約になると勘違いする。
FAQ
Q: 予約空き領域を後から変更できますか?
A: はい、多くの RDBMS では再編成時に比率を再指定できます。ただし再編成自体が I/O コストを伴うため計画的に行う必要があります。
A: はい、多くの RDBMS では再編成時に比率を再指定できます。ただし再編成自体が I/O コストを伴うため計画的に行う必要があります。
Q: ページ内の予約空き領域を INSERT が全く使えないのはなぜ?
A: 予約部分は“将来の UPDATE による行拡張”用に確保され、INSERT の空き領域探索対象外となる実装があるためです。
A: 予約部分は“将来の UPDATE による行拡張”用に確保され、INSERT の空き領域探索対象外となる実装があるためです。
Q: 行削除を併せて行えば問題は解決しますか?
A: 削除+再編成でページを詰めれば空き領域確保量を抑えられますが、削除処理自体が長時間かかる点と運用タイミングに注意が必要です。
A: 削除+再編成でページを詰めれば空き領域確保量を抑えられますが、削除処理自体が長時間かかる点と運用タイミングに注意が必要です。
関連キーワード: ページ分割、空き領域予約、再編成、挿入アルゴリズム、ストレージ効率
設問2:”3. バッチ処理のジョブの多重化”について答えよ。
(1)表3中の(a)〜(c)に入れる適切な理由を、それぞれ 30 字以内で答えよ。ここで、在庫は適正に管理され、欠品はないものとする。
模範解答
a:異なる商品の“在庫”を逆順で更新することがあり得るから
b:“棚別在庫”を常に主キーの順で更新しているから
c:異なるジョブが同じ注文の明細行を更新することはないから
解説
解答の論理構成
-
ケース1(在庫引当×在庫引当、対象:“在庫”)
- 引当処理は【問題文】「“注文明細”をキー順に読み込み、その順で“在庫”を更新」とある。
- ジョブを注文番号範囲で分割すると、各ジョブが異なる“商品コード”の在庫行を別々の順序で更新し得る。
- 更新順序が異なると互いに行ロックを取り合い“逆順”になりデッドロックが発生。
⇒ (a)「異なる商品の“在庫”を逆順で更新することがあり得るから」
-
ケース2(出庫指示×出庫指示、対象:“棚別在庫”)
- 出庫指示処理は【問題文】「“出庫指示”をキー順に読み込み、その順で“棚別在庫”を更新」と明記。
- キー順(=主キーの昇順)で常に同一順序でロック取得するため、同時ジョブ間でロック待ちは発生しても循環待ちは起きない。
⇒ (b)「“棚別在庫”を常に主キーの順で更新しているから」
-
ケース3(在庫引当×出庫指示、対象:“注文明細”)
- 在庫引当は注文状態“0”を“1”に、出庫指示は注文状態“1”を“2”に変更。
- ジョブ分割では注文番号範囲が互いに排他となり、状態値も異なるため「同じ行」を同時にロックする機会が無い。
⇒ (c)「異なるジョブが同じ注文の明細行を更新することはないから」
誤りやすいポイント
- 「キー順読み込み」がそのまま「キー順更新」になると早合点しがち。ケース1は読み込みテーブルと更新テーブルが異なるため順序が保持されない。
- デッドロック=ロック待ちと混同し、単なる待ち時間をリスクと誤認する。
- 注文状態による行排他を見落とし、ケース3でもリスクありと判断してしまう。
FAQ
Q: キー順で読んでも更新対象テーブルが違うと順序は崩れるのですか?
A: はい。在庫引当では読み込み元は“注文明細”、更新先は“在庫”です。読み込んだ明細に含まれる“商品コード”の並びは注文入力順でバラバラなので、各ジョブで“在庫”行に当たる順序が一致しません。
A: はい。在庫引当では読み込み元は“注文明細”、更新先は“在庫”です。読み込んだ明細に含まれる“商品コード”の並びは注文入力順でバラバラなので、各ジョブで“在庫”行に当たる順序が一致しません。
Q: 主キー順で更新していれば必ずデッドロックは防げますか?
A: 同一テーブルを複数ジョブが同じ主キー順(昇順/降順のどちらかで統一)で更新する限り、循環待ちは発生しないためデッドロックは回避できます。
A: 同一テーブルを複数ジョブが同じ主キー順(昇順/降順のどちらかで統一)で更新する限り、循環待ちは発生しないためデッドロックは回避できます。
Q: 状態遷移で排他を避ける設計は汎用的に有効ですか?
A: 注文処理のように一方向のワークフローで行が段階的に処理される場合、有効な手法です。ただし更新漏れやリカバリ時の整合性チェックが必須です。
A: 注文処理のように一方向のワークフローで行が段階的に処理される場合、有効な手法です。ただし更新漏れやリカバリ時の整合性チェックが必須です。
関連キーワード: デッドロック、ロック順序、主キー順更新、バッチ多重化、状態遷移
設問2:”3. バッチ処理のジョブの多重化”について答えよ。
(2)表3中のケース1のリスクを回避するために、注文登録処理又は在庫引当処理のいずれかのプログラムを変更したい。 どちらかの処理を選び、選んだ処理の処理名を答え、プログラムの変更内容を具体的に 30 字以内で答えよ。た だし、コミット単位と ISOLATION レベルを変更しないこと。
模範解答
処理名:注文登録
変更内容:・“注文明細”に行を商品コードの順に登録する。
・商品コードの順に注文明細番号を付与する。
処理名:在庫引当
変更内容:・“在庫”の行を商品コードの順に更新する。
解説
解答の論理構成
- デッドロックの状況整理
表3ケース1は「在庫引当」「在庫引当」「在庫」「ある」と示され、(a) にリスク理由が記載されています。 - 原因:ロック取得順不同
表2「在庫引当」の説明
「注文状態が未引当の “注文明細” をキー順に読み込み、その順で “在庫” を更新し…」
ここで “キー順” は主キー(注文番号→注文明細番号)です。ジョブを「注文番号の範囲」で並列実行すると、ジョブAは商品S1→S2、ジョブBは商品S2→S1…のように “在庫” 行を異なる順序で更新し、循環待ちが起こります。 - 対策方針:ロック順をそろえる
同一テーブルを複数ジョブが共有しても、更新順序が一致すれば待ちは線形となりデッドロックになりません。そこで
・「注文登録」で “注文明細” を “商品コード” 順に登録する
・または「在庫引当」で “在庫” を “商品コード” 順に更新する
のいずれかを行えば、全ジョブが同じ “商品コード” 昇順(または降順)でロックを取得します。 - コミット単位と ISOLATION レベルは不変
問題指示どおり「注文ごとにコミット」「変更しない」を守りつつ、プログラムの内部ループ順序だけを変更するため要件に適合します。
誤りやすいポイント
- 「在庫引当」を並列化しなければ良いと考え、速度向上の目的を見失う。
- “注文明細” を読む順を変えるだけでは “在庫” 更新順が保証されない点を見落とす。
- コミット単位を小さくしてロック時間を短縮する案は、本問では禁止事項。
FAQ
Q: 並列ジョブ数を1に制限する方が安全では?
A: 安全ですがスループット向上という要件を満たせません。更新順統一なら並列化と安全性を両立できます。
A: 安全ですがスループット向上という要件を満たせません。更新順統一なら並列化と安全性を両立できます。
Q: “商品コード” 順以外でも良い?
A: 昇順・降順どちらでも構いません。すべてのジョブが同じ順序で取得することが重要です。
A: 昇順・降順どちらでも構いません。すべてのジョブが同じ順序で取得することが重要です。
Q: 片方のプログラムだけ直せば十分?
A: はい。注文登録で行順序を整えるか、在庫引当で更新順序を整えるかのどちらかでデッドロックは防げます。
A: はい。注文登録で行順序を整えるか、在庫引当で更新順序を整えるかのどちらかでデッドロックは防げます。
関連キーワード: デッドロック、ロック順序、更新順序制御、バッチ並列化、商品コード
設問3:
- 出庫作業の遅延原因の分析について答えよ。
(1)本文中の(あ)〜(か) に入れる適切な字句を答えよ。
模範解答
あ:A.ピッカーID
い:B.棚番号
う:6番
え:S6
お:3番
か:S3
解説
解答の論理構成
-
(あ) と (い) の選択
- 出庫間隔時間は「ピッカーが出庫指示書の1番目の商品を出庫する場合では当該注文の出庫開始時刻からの時間」と定義されています。
- これを SQL で実装するには
PARTITION BY
でピッカー単位に区切り、同一ピッカー内でORDER BY B.出庫時刻
の時系列を作ります。 - よって (あ)=「A.ピッカーID」。
- 逆に
B.棚番号
で区切ると棚単位になり、ピッカー間の待ち時間が除外されて分析目的に合いません。(い) はリスク説明用の対比として「B.棚番号」。
-
(う)〜(か) の選択
- 対策案で示された例:
「あるピッカーに、1番目に棚3番の商品S3, 2番目に棚6番の商品S6」
「別のピッカーには、1番目に棚(う)の商品(え)、2番目に棚(お)の商品(か)」 - デッドロックを発生させるにはロック取得順序を逆にする必要があるため、
・(う)=「6番」、(え)=「S6」
・(お)=「3番」、(か)=「S3」。 - これによりピッカーAは【棚3番→棚6番】、ピッカーBは【棚6番→棚3番】で互いのロックを占有し合います。
- 対策案で示された例:
誤りやすいポイント
PARTITION BY B.棚番号
を選び、棚ごとに区切ってしまう
→ ピッカー待ち時間が含まれず目的不達。- (う)と(お)を同じ棚番号にしてしまう
→ ロック順序が同一になりデッドロック例にならない。 - デッドロックは更新行単位と誤解
→ 本問は「棚別在庫」行の複合主キー(棚番号+商品コード)で発生する。
FAQ
Q:
A: 注文番号を含めると出庫間隔が注文境界で途切れ、ピッカー移動中の待ち時間が分散してしまいます。分析目的は「棚前の滞留」であり、ピッカー単位が最適です。
PARTITION BY A.ピッカーIDでも注文番号を含めた方が安全では?
A: 注文番号を含めると出庫間隔が注文境界で途切れ、ピッカー移動中の待ち時間が分散してしまいます。分析目的は「棚前の滞留」であり、ピッカー単位が最適です。
Q: 棚順固定でもロック順序が変わるのはなぜ?
A: 出庫指示書の生成順序が異なるため、ピッカーAとBで同じ棚を異なる順番で更新し得ます。ロックは SQL の実行順に取得されるのでデッドロックが起こり得ます。
A: 出庫指示書の生成順序が異なるため、ピッカーAとBで同じ棚を異なる順番で更新し得ます。ロックは SQL の実行順に取得されるのでデッドロックが起こり得ます。
Q: 再編成をしない決定とデッドロック対策は無関係?
A: はい、再編成は物理配置・ストレージ空き領域の問題、デッドロックは同時更新時のロック順序問題で、切り分けて対策を検討します。
A: はい、再編成は物理配置・ストレージ空き領域の問題、デッドロックは同時更新時のロック順序問題で、切り分けて対策を検討します。
関連キーワード: LAG関数、ウィンドウ関数、ロック順序、デッドロック
設問3:
- 出庫作業の遅延原因の分析について答えよ。
(2)下線の対策を適用した場合、表3中のケース2で起きると予想したデッドロックを回避するために、出庫指示処理のプログラムをどのように変更すべきか。 具体的に 40 字以内で答えよ。 ただし、コミット単位と ISOLATION レベルを変更しないこと。
模範解答
・“出庫指示”の読み込み順を出庫番号、商品コード、棚番号の順に変更する。
・“棚別在庫”の行を商品コード、棚番号の順に更新する。
解説
解答の論理構成
-
問題が想定する競合
表3のケース2は「出庫指示―出庫指示」「テーブル名 “棚別在庫”」「リスクの有無『ない』」と整理されているが、 追加対策で「多くのピッカーが同じ棚(棚3番)」に集中しないよう指示順を変えると、 「1番目棚3番→2番目棚6番」と「1番目棚6番→2番目棚3番」のように複数ジョブが逆順で
同じ行を更新し合いデッドロックが起こり得る。 -
現行プログラムの動き
表2 “出庫指示” に
「“出庫指示”をキー順に読み込み、その順で “棚別在庫” を更新」
とある。主キーは図1より《出庫番号、棚番号、商品コード》で、 棚番号が先頭になるためジョブAとジョブBでロック取得順が変わる。 -
解決の基本原則
デッドロックは「同一資源を異なる順序でロック取得」が原因。
全トランザクションが同一順序で取得すれば必ず待ち合わせは一方向となり解消できる。 -
具体的変更内容
a) “出庫指示”読込順をORDER BY 出庫番号、商品コード、棚番号
に固定
b) 取得した行をそのまま《商品コード、棚番号》で“棚別在庫”を更新
これにより全ジョブが同じ商品→棚の順でロックを取得し循環待ちを防止できる。
コミットは「注文ごとにコミットする」まま、ISOLATION レベルも変更不要のため問題要件を満たす。
誤りやすいポイント
- 「ロック待ちが少ないからデッドロックしない」と早合点
- コミット単位を細かくすれば解決できると思い込み、要件違反になる
- “棚別在庫”の更新順だけ直し、“出庫指示”の読込順を変え忘れる
FAQ
Q: 読込順と更新順を合わせる必要がありますか?
A: はい。同じ並びのまま更新へ渡すことでロック取得順が完全に一致し、デッドロックを防げます。
A: はい。同じ並びのまま更新へ渡すことでロック取得順が完全に一致し、デッドロックを防げます。
Q: ROW LOCK と TABLE LOCK のどちらが対象ですか?
A: 各在庫行を更新するため行ロック(ROW LOCK)が用いられます。行ロックでも取得順が食い違えばデッドロックします。
A: 各在庫行を更新するため行ロック(ROW LOCK)が用いられます。行ロックでも取得順が食い違えばデッドロックします。
Q: インデックスを追加すれば回避できますか?
A: 処理順序の不一致が原因なのでインデックス追加だけでは根本解決になりません。
A: 処理順序の不一致が原因なのでインデックス追加だけでは根本解決になりません。
関連キーワード: ロック順序制御、デッドロック、並列バッチ、行ロック、更新順序統一
