セキュリティ上の問題があります。テーブルをロックすることが解決策になると思いますが、MySQL や PHP で適切にロックする方法がわからず、Google やドキュメントを検索する時間がもうありません。
タスクは、
データベースを作成し、宝くじをランダムに取得するための php コードを作成することです。
数行しか含まれていないテーブルがあります。(ID、名前、数量)
たとえば、次のようになります。
1 - 勝てない - 20000
2 - ハローキティのバッグ - 200
3 - とても素敵なペン - 50 など
私は php を書いたので、ロジックは次のようになります:
1
)
データベースからすべてのチケットの量を取得し、間隔を含む PHP 配列を作成します
。: 20250.
2) 1 から最大までの乱数を生成するので、ユーザーがどのチケットを取得したかがわかります。
3) データベースを更新します。適切な行から 1 を引きます。
さて、これはうまく機能しますが、問題は次のとおりです。
非常に多くのユーザーがいて、そのうちの2人または3人が同時にクリックし、同じ数をランダムに(ハローキティだと仮定しましょう)、1つしか持っていない場合はどうなりますかそのアイテム?
それらの 3 つすべてが、0 で停止するのではなく、データベースから減算されます (この例では、-2 ハロー キティ バッグがあります)。
少なくとも私にとっては大きな問題です。
要約すると、私の質問は次のとおりです
。1)減算する準備ができるまで、テーブルを選択からロックするにはどうすればよいですか? それは良い解決策ですか?
2)それを 1 つのクエリにすることはできますか、それとも MySQL はそれを処理できませんか?
3) その他の解決策は?
すべての回答に感謝します。
前もって感謝します。また、長い投稿で申し訳ありませんが、物事をまっすぐにしたかったのです。
[解決済み]
ストアド プロシージャを使用しました。詳細は次のとおりです。私が読んだように、MyISAM システムはこのバージョンより上のストアド プロシージャのみをサポートしているため、サーバーのバージョンを 5.x より上にできたのは幸運でした。誰かが将来役立つことを期待して、ここにいくつかのコードを書きます。
delimiter //
CREATE PROCEDURE `name`(IN a_parameter INT(20))
DECLARE some_text VARCHAR(50) DEFAULT '';
#now using all this stuff
SELECT `name` INTO some_text FROM `users_table` WHERE `table_id` = a_parameter;
SELECT some_text
END//
delimiter ;