PHP-MYSQL は購入代金を差し引くプロセス (詳細はたくさんあります) をどのように実装しますか?
ユーザーが「キャンディー」などの仮想商品と交換するために自分のお金の残高とユーザーが所有する「キャンディー」の数を別のテーブルに記録するとします。これはユーザーのお金を差し引くと同時に、ユーザーの仮想アイテムリストの「砂糖」の数が1になります。ユーザーの「キャンディー」の数の上限は 99 個であると仮定します。
まず、私の現在の考えについて話させてください:
* まず、ユーザー アカウントの残高を照会するために選択します。 (SQL ステートメント 1)
* お金の残高と 1 個の「砂糖」の価格を比較し、残高が十分であれば続行します (PHP ロジックの実装)
* トランザクションが開始します
* お金の残高を減算して更新します「砂糖」1個の値段。ここで疑問 A が生じます。「砂糖」の価格を差し引いた残高に直接更新する必要がありますか (つまり、PHP が最初に残高を計算します)、それとも MYSQL にフィールドの減算を行わせる必要がありますか? (SQL ステートメント 2)
* ユーザーの 'sugar' の数を選択します (SQL ステートメント 3)
* 前の選択の結果がなかった場合は、ユーザーの 'sugar' のレコードとその数値を挿入します。今回購入した「砂糖」の「番号」です。ユーザーの「砂糖」レコードがある場合は、「砂糖」の番号を更新してそれに 1 を加えます。ここで問題 B が発生します。単一ユーザーの「sugar」数の上限は 99 であるため、PHP ロジックを使用して、1 の後の「sugar」数が上限の 99 を超えているかどうかを判断する必要があります。 SQL ステートメント 1 と 3 には「更新用」ロック テーブルがありません。質問 A と組み合わせると、ユーザーが「キャンディ」を購入する 2 つのリクエストを同時に送信すると、実際には「キャンディ」の数が超過する可能性があります。上限は 99 (たとえば、100 に達します)
*最後のトランザクションが送信されます
したがって、最後の質問が 2 つあります:
C: 交換で 1 つのリソースを消費するこのロジックと同様別のリソースについては、特定の数のリソースを選択するときに「更新用に選択」する必要があります。ロックしますか? (最初に選択しないと、お金が足りているか、砂糖の量が制限を超えているかなどの論理的な判断ができなくなります。選択後に更新すると、選択したデータが崩れる恐れがあります)
D: 上記のプロセスを簡略化する方法はありますか?
あるいは、この問題について詳しい記事があれば、シェアしていただければ幸いです。
------ソリューションのアイデア----------------------
これは、次のことを確実にするために必須です。トランザクションを使用して、失敗してロールバックしてから、正常に送信します
------解決策のアイデア------ -
トランザクション処理を使用する必要があります。
------解決策のアイデア----------------------
最初にトランザクションを設定し、次にトランザクションを選択しますfor update は現在の在庫を取り出し、十分であればログ テーブルにレコードを挿入し、次に在庫を更新して控除を完了し、最後にトランザクションを解放します。