我有安全问题。我认为锁定一个表是一种解决方案,只是我不知道如何在MySQL、PHP中正确地执行它,并且没有足够的时间搜索谷歌和文档。
因此,任务
创建一个数据库并编写一个php代码来随机获取彩票。
我有一张只有几行的桌子。(id、姓名、数量)
例如:
1-没有赢- 20000
2-包- 200
3-一支非常好的钢笔- 50等。
我编写了php,因此逻辑如下:
1)从数据库中获取每个票证的数量,并创建一个包含间隔的PHP数组,如下所示:
没有胜利:200000,
凯蒂猫包: 20200,
一支非常漂亮的钢笔: 20250。
2)生成一个从1到最大值的随机数,这样我就知道用户得到了什么票。
3)更新数据库:从正确的行中减去1。
现在,这是很好的工作,但是问题
如果我有大量的用户,他们中的两三人同时点击,随机选择相同的数字(假设是hello kitty),但只有1项呢?
他们三个都从数据库中减去,而不是在0处停止。(在本例中,我们将有-2你好小猫包)
至少对我来说是个大问题。
总之,我的问题是:
(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 ;发布于 2012-06-26 08:12:34
您需要使用事务(文档这里)和表锁(了解表锁和事务这里之间的交互)。
要在一个查询中执行此操作,您可以构建一个存储过程(Documents这里)。我要做个手术。
如果您正在使用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-26 08:11:02
查找“事务”。使用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/
等
https://stackoverflow.com/questions/11203106
复制相似问题