首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL表锁,还是其他可能的解决方案?

MySQL表锁,还是其他可能的解决方案?
EN

Stack Overflow用户
提问于 2012-06-26 08:04:17
回答 2查看 180关注 0票数 0

我有安全问题。我认为锁定一个表是一种解决方案,只是我不知道如何在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系统只支持这个版本之上的存储过程。我将在这里编写一些代码,希望将来有人会发现它有用:

代码语言:javascript
复制
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 ;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-26 08:12:34

您需要使用事务(文档这里)和表锁(了解表锁和事务这里之间的交互)。

要在一个查询中执行此操作,您可以构建一个存储过程(Documents这里)。我要做个手术。

如果您正在使用PDO,您可以在手册(这里,最重要的PDO::beginTransaction和PDO::commit)中阅读所有内容。如果您仍然在使用mysql扩展,您需要显式地这样做:

代码语言:javascript
复制
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');
票数 1
EN

Stack Overflow用户

发布于 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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11203106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档