在庫数stockが1の商品の注文を、二つの処理が同時に受け付ける。各処理は最初にstockを読み、1以上なら後でstockを0に更新するため、両方が注文成功になることがある。データベースは、次の条件付きUPDATEを一つの不可分な操作として実行し、実行時点の値で条件を評価するものとする。在庫の二重販売を防ぐ処理はどれか。
本サイトで独自に作成。IPAの試験問題からの転載ではありません。
公開日:
選択肢を選んで、答え合わせをしましょう。
回答せずに正解・解説を確認する
正解:ウ UPDATE products SET stock = stock - 1 WHERE id = 対象ID AND stock >= 1を実行し、更新件数が1件のときだけ注文を確定する
この表示だけでは、回答数や正答率は変わりません。
解説
読取りと更新が別々だと、両処理が在庫1を読んでから同じ値0を書き込み、注文だけが二つ成功します。設問の条件付きUPDATEなら、最初の成功で在庫が0となり、次の処理はstock >= 1を満たさず更新件数0です。注文確定を更新件数1に結びつけます。
確認後に別の処理が在庫を変え得るため、最初の読取りだけでは二重販売を防げません。
待ち時間は排他制御になりません。同じタイミングで再開すれば同じ競合が起きます。
条件確認と減算を不可分に行い、実際に1件減算できた処理だけを成功させます。
古い在庫の値を共有すると、その後の変化を反映できず、むしろ誤判断が続きます。
関連知識
実際の注文では在庫更新と注文登録を一つのトランザクションで扱い、登録失敗時に在庫だけが減らないようにします。行ロックや楽観的ロックも競合対策ですが、データベースの分離レベルとロックの仕様を確認して設計します。
間違えやすいポイント
SQLを使えば自動で業務上の競合がなくなる、と考えないこと。何を不可分にし、成功をどの結果で判定するかが必要です。この問題では不可分な条件付き更新という前提が与えられています。
覚え方
確認してから更新、の隙間をなくす。更新件数で成功を判断。
実務での意味
残席やクーポンの限定数を減らすAPIで、同時リクエストのテストを行い、成功数が用意した個数を超えないことを確かめます。
解説:本サイト編集部によるオリジナル文章