ホームページ >バックエンド開発 >PHPチュートリアル >PHP-MYSQL は、購入代金を差し引くプロセス (多くの詳細) をどのように実装していますか?

PHP-MYSQL は、購入代金を差し引くプロセス (多くの詳細) をどのように実装していますか?

WBOY
WBOYオリジナル
2016-06-23 13:26:091222ブラウズ

ユーザーがお金の残高を「キャンディ」などの仮想商品と交換するために使用すると仮定します。ユーザーが所有するお金の残高と「キャンディ」の数は別のテーブルに記録されます。ユーザーのお金と同時に、ユーザーの仮想アイテムリスト内の「キャンディー」の数+1。ユーザーの「キャンディー」の数の上限は 99 個であると仮定します

まずは私の現在の考えについて話させてください:

*最初にユーザーのアカウントの残高をクエリするために選択します (SQL ステートメント 1)
*比較お金の残高と「キャンディー」1個の価格、残高が十分であれば続行(PHPロジック実装)
*トランザクション開始
*お金の残高を更新し、「砂糖」1個の価格を差し引きます。ここで疑問 A が生じます。「砂糖」の価格を差し引いた残高に直接更新する必要がありますか (つまり、PHP が最初に残高を計算します)、それとも MYSQL にフィールドの減算を行わせる必要がありますか? (SQL ステートメント 2)
*ユーザーの 'sugar' の数を選択します (SQL ステートメント 3)
*前の選択で結果がなかった場合は、ユーザーの 'sugar' のレコードを挿入します。その数は、今回購入した「sugar」。このユーザーの「sugar」レコードがすでに存在する場合は、「sugar」番号を更新してそれに 1 を加えます。ここで問題 B が発生します。単一ユーザーの 'sugar' の数の上限は 99 であるため、PHP ロジックを使用して、'sugar' + 1 の数が上限の 99 を超えているかどうかを判断する必要があります。 SQL ステートメント 1 と 3 のテーブルには「for update」ロックがありません。質問 A と組み合わせると、ユーザーが「キャンディー」を購入する 2 つのリクエストを同時に送信すると、実際には「キャンディー」の数が超過する可能性があります。上限は 99 (たとえば、100 に達します)
*最後のトランザクションが送信されます

それでは、最後の質問があと 2 つあります:
C: 別のリソースと引き換えに 1 つのリソースを消費するこのロジックと似ていますね。特定の数のリソースを選択するときは「更新用に選択」する必要がありますか? (最初に選択しないと、お金が足りているか、砂糖の量が制限を超えているかなどの論理的な判断ができなくなります。選択後に更新すると、選択したデータが崩れる恐れがあります)途中で変更される可能性があります)
D: 上記のプロセスを簡素化する方法はありますか?

または、この問題に関する詳しい記事があれば、共有していただければ幸いです。


ディスカッションに返信(解決策)

助けて! ! ! !

ユーザーが操作を続けると同時実行の問題が発生するのではないかと心配していませんか? ユーザーが一度クリックすると、バックグラウンド処理が正常に結果を返した後、ボタンのロックを解除します

mysql トランザクション。処理

ユーザーが一度クリックすると、バックグラウンド処理が完了して結果が正常に返されると、ボタンはクリックできなくなるのではないかと心配していませんか?ロックが解除されます


これは実際にフロントエンドで行われたケースです。 。ただし、バックエンドはシングルユーザーの同時実行性の問題も考慮する必要があります

これが確実に行われるようにするには、トランザクションが失敗してロールバックされるか、正常に送信されるかのいずれかを使用する必要があります

トランザクション処理を使用する必要があります。

まずトランザクションを適用し、更新を選択して現在の在庫を取り出し、十分であればログテーブルにレコードを挿入し、在庫を更新して控除を完了し、最後にトランザクションを解放します。

ディスカッションのために QQ に私を追加してください: 120848369。私も最近これを行う準備をしています。現在のソリューションはトランザクション + ロックであり、単一の製品の在庫パフォーマンスはあまり良くない可能性があります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。