2

現在、クライアント用の PHP e コマース Web サイトを構築しています。順調に進んでいますが、障害にぶつかり、MySQL/PHP の専門家が助けてくれるかどうか疑問に思っていました。基本的に、e コマース サイトは商品を 1 回だけ販売します (つまり、商品ごとに 1 つの数量しか在庫がありません)。つまり、顧客がその商品をチェックアウトすると、それ以上購入することはできません。

そのため、チェックアウト時に、商品がまだ在庫があるかどうかを確認する必要があります。これがトラフィックの多いサイトであると仮定すると、2 人以上の顧客が同時にチェックアウトしようとする場合があり、両方が製品を購入できる可能性があります。それを防ぐために、私の計画は次のとおりです。

  1. テーブルの行をロックするには、製品で [...FOR UPDATE] を選択します。
  2. 電子商取引を行う (Paypal、authorize.net など)
  3. e コマース トランザクションが成功した場合は、MySQL ストアド プロシージャ (SQL トランザクションも持つ) を呼び出して、注文情報などを保存します。または、失敗した場合はロールバックします。

この計画を実現することは可能ですか?SELECT...FOR UPDATE を実行するには、SQL トランザクションを開始する必要がありますが、その後、MySQL ストアド プロシージャ内のステップ 3 で別のトランザクションも開始しています。何が起こるかわかりません。また、この計画は行き詰まりのシナリオにつながりますか?

長い質問で申し訳ありませんが、助けていただければ幸いです。

4

1 に答える 1

0

ストアド プロシージャの内部でトランザクション制御を行うべきではないことをお勧めします。それがあなたの困難の原因のようです。

他の呼び出し元がそのようなストアド プロシージャを必要とする場合は、「動作」を新しいストアド プロシージャに分解することを検討してください。

于 2010-07-08T08:11:54.557 に答える