0

我有一个安全问题。我认为锁定一个表将是一个解决方案,只是我不知道如何在 MySQL、PHP 中正确执行它,并且没有足够的时间搜索 Google 和文档了。

因此,任务
创建一个数据库并编写一个 php 代码以随机获取彩票。
我有一个表,它只包含几行。(身份证、姓名、数量)

例如:

1 - 没有获胜 - 20000
2 - Hello Kitty 包 - 200
3 - 一支非常漂亮的笔 - 50 等等。

我写了 php,所以逻辑如下:
1) 从数据库中获取每张门票的数量,并创建一个包含间隔的 PHP 数组,例如:
no win: 20000,
Hello Kitty bag: 20200,
一支非常不错的笔: 20250.
2) 生成一个从 1 到最大的随机数,这样我就知道用户拿到了什么票。
3)更新数据库:从正确的行中减去1。

现在,这很好用,但是问题是:
如果我有大量用户,并且其中两个或三个同时点击,随机相同的数字,(假设它是 hello kitty)但只有 1 个那个项目?
他们三个都从数据库中减去,而不是在 0 处停止。(在这个例子中,我们将有 -2 hello kitty bag)

大问题,至少对我来说。
所以总而言之,我的问题是:
1)我怎样才能从选择中锁定表格,直到我准备好减去?这是一个很好的解决方案吗?
2)我可以使它成为一个查询,还是 MySQL 无法处理?
3)其他解决方案?

我很感激每一个答案,真的!
在此先感谢,也很抱歉发了这么长的帖子,但想保持直截了当。
[已解决]
我使用了存储过程,这是详细信息。我的服务器版本高于 5.x 很幸运,因为当我阅读时,MyISAM 系统仅支持此版本以上的存储过程。我将在这里编写一些代码,希望将来有人会发现它有用:

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

您需要使用事务(此处的文档)和表锁(在此处阅读有关表锁和事务之间的交互的信息)。

要在一个查询中执行此操作,您可以构建一个存储过程(此处的文档)。我会去一个程序。

如果您使用的是 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

查找“事务”.. 使用 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/

ETC

于 2012-06-26T08:11:02.487 回答