シンプルなショッピングカートを作っています。現在、顧客が在庫切れの製品を決して購入できないようにするために、注文を処理するときに、カート内の各製品に対してループを作成しています。
-- トランザクションを開始します -- カート内の各製品をループして、
- 商品表から在庫数を選択
在庫がある場合:
- 商品から在庫数を減らします
- 注文商品テーブルに商品を追加する
それ以外の場合は、ロールバックを呼び出してエラーを返します
-- (ロールバックの呼び出しがない場合、すべてがコミットで終了します --
ただし、特定の製品のチェック後に製品の在庫数が更新されると、不一致が生じる可能性があります。
質問: 注文を処理しているときはいつでもテーブルを書き込みからロックするのは良い考えですか? そのため、上記の「ループ」が発生した場合、他の誰も製品数を変更できず、常に正確であることが保証されます.
製品数/在庫状況は常に一定であり、在庫数が -1 になることはありません (これは満たされない可能性があります)。
ただし、ロックが非効率的/悪影響を及ぼしているという投稿を非常に多く見てきました。もしそうなら、これを達成するための最良の方法は何ですか?
update + select クエリで処理するなどの代替手段を見てきましたが、場合によっては適切でないこともあります。