少し前に構築したこのオンライン ショップがあり、製品在庫テーブルで LOCK TABLES を使用して、在庫が 0 を下回ったり、適切に更新されなかったりしないようにしています。
最近、データベースに多くのトラフィックと多くの操作 (他の LOCK TABLES も) があったため、データの一貫性を維持するためのより高速で安全な方法がないか自問自答しています。
トランザクションとその仕組みを理解しようとしていますが、次のロジックがチェックアウト プロセスにうまく適用されるかどうか疑問に思っています。
1) START TRANSACTION (これにより、いずれかのクエリが失敗した場合、または在庫などの他の条件が必要以上に低い場合に、後続のクエリをロールバックできます)
2) 「customers」テーブルに顧客を挿入します
3) 'orders' テーブルに注文情報を挿入する
4) 異なるテーブルへの同様のクエリ
5) カート内の各製品について:
5.1) update products set stock = stock - x where stock - x >= 0 (x は顧客が購入したい単位)
5.2) 影響を受ける行を確認し、影響を受ける行 == 0 の場合は ROLLBACK して終了します (現在の製品の在庫が不足しているため、注文をキャンセルするか、エラーをスローします)。
5.3) その他のクエリ...など
6) コミット
その音は正しいですか?
私が得られない (そして、そもそも心配する必要があるかどうかわからない) のは、同時セッション (別の顧客) が同じものを配置しようとした場合に、「製品」テーブルと在庫数に何が起こるかです。注文または同じ商品の一部を含む注文。
2 番目のトランザクションは最初のトランザクションが終了するのを待ち、2 番目のトランザクションは最新の在庫数を使用しますか、それとも両方が同時に実行され、場合によっては両方が失敗する可能性がありますか?