MySQL重结果读/写

MySQL重结果读/写,mysql,locking,Mysql,Locking,我有一个PHP彩票游戏。它非常简单,由三个表组成: awards: - ID - award_name wingames: - ID - ID_award allgames: - ID_user - won_game (bool) - award_id (if game not won, then it is 0) 据宣布,比赛将于下午18:00开始。大约有100名用户不断点击“试着赢”。管理员有时会在wingames表中插入奖励id,以便下一个单击的用户赢得该项目 此按钮可

我有一个PHP彩票游戏。它非常简单,由三个表组成:

awards:
 - ID
 - award_name

wingames:
 - ID
 - ID_award

allgames:
 - ID_user
 - won_game (bool)
 - award_id (if game not won, then it is 0)
据宣布,比赛将于下午18:00开始。大约有100名用户不断点击“试着赢”。管理员有时会在wingames表中插入奖励id,以便下一个单击的用户赢得该项目

此按钮可执行以下操作: 从wingames limit 1中选择id_奖励; -如果没有行-用户输掉游戏,则进行以下查询: 将值(43,false,0)插入所有游戏(id用户、赢得游戏、奖励id); -如果有一行-用户赢得游戏,软件会进行以下两个查询: 在所有游戏(id用户、赢得游戏、奖励id)中插入值(43,真,5); 从wingames删除

有一个问题:在执行“从wingames中删除”查询之前,另一个用户从该表中读取,他有一个奖励。因此,当两个用户同时单击该按钮时,可能会出现两个赢家而不是一个。这是一个大问题,因为我必须给两个奖而不是一个

我在网上查找了一些“锁表”解决方法,但没有找到合适的示例


你有什么(可能是快速而肮脏的)解决方案吗?

正如虫族提到的,你需要选择。。更新。它将锁定游戏,直到您的交易结束

START TRANSACTION;

SELECT * FROM wingames FOR UPDATE;
/* from now on, only one request can continue, the others are blocked */

INSERT INTO allgames ...

DELETE FROM wingames WHERE ID = ...

COMMIT;

您应该在两个交互式客户端上尝试此操作,以了解FOR UPDATE语句的工作原理。

阅读关于
SELECT。。。对于更新
,作为对的附加预防措施,您可以将表
allgames
中的字段
award\u id
限制为唯一,以防止用户拥有相同的
award\u id
,因此您只需为每个奖项颁发一个奖项。谢谢,这是一个好主意,但可以赢得相同的价格。。。例如,我有两部手机要送,所以我18:30送一部,18:45送第二部。。。手机有相同的奖项id。我有9个不同的奖项。如何在php中做到这一点?我是说像。。。在单独的查询中?mysql\u query(“启动事务;”)mysql\u query(“选择…”我只有一个db连接,这不重要吗?是的,每个事务一个连接。我尝试了这个。结果有所改善,但问题出现了一次-我在一个项目上有两个赢家。每个项目都比两个赢家好,但没有解决我的问题。有什么建议吗?