0

セキュリティ上の問題があります。テーブルをロックすることが解決策になると思いますが、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 ;
4

2 に答える 2

1

トランザクション (ドキュメントはこちら) とテーブル ロック (テーブル ロックとトランザクションの相互作用についてはこちら)を使用する必要があります。

1 つのクエリでそれを行うには、ストアド プロシージャを作成します (ドキュメントはこちら)。手続きをしていきます。

PHP PDO を使用している場合は、マニュアルですべてを読むことができます (ここで、最も重要な PDO:: beginTransaction および PDO:: commit)。まだ拡張を使用している場合は、次mysqlのように明示的に行う必要があります。

mysql_query('START TRANSACTION');
// Because you cannot nest lock's and transactions, this is a workaround to lock the table
mysql_query('SELECT * FROM foo FOR UPDATE'); // Lock issued, the important part is "FOR UPDATE"
//[ your query's here ]

// if something goes wront, revert the changes
mysql_query('ROLLBACK');
// at the end commit the changes
mysql_query('COMMIT');
于 2012-06-26T08:12:34.740 に答える
0

Lookup "transactions".. mysqli/pdo とそのトランザクション機能を使用

http://tympanus.net/codrops/2009/09/01/using-mysql-transactions-with-php/

http://www.shotdev.com/php/php-mysql/php-mysql-and-transaction-begin-commit-rollback/

于 2012-06-26T08:11:02.487 に答える