我正在构建一个即时赢得比赛抽奖活动。基本上在一小时内随机选择的一分钟内,下一个提交细节的用户应该被选为赢家。PHP/MySQL即时赢取程序 - 如何确保只有一个赢家被选中?
我遇到的问题是,如果MySQL正在运行多个连接,那么我该如何阻止两个或三个赢家被误操作?我可以限制连接吗,或者让PHP等待所有当前的MySQL连接关闭?
我正在构建一个即时赢得比赛抽奖活动。基本上在一小时内随机选择的一分钟内,下一个提交细节的用户应该被选为赢家。PHP/MySQL即时赢取程序 - 如何确保只有一个赢家被选中?
我遇到的问题是,如果MySQL正在运行多个连接,那么我该如何阻止两个或三个赢家被误操作?我可以限制连接吗,或者让PHP等待所有当前的MySQL连接关闭?
使用时,你的更新,你要更新的并发检查您的WHERE子句中字段的初始值。这样,只有第一个被执行的将会经过,因为之后它将不再匹配WHERE子句。您可以通过使用mysql_affected_rows()
函数来确定哪些用户已经完成,哪些成功更新将返回1
,其他用户则返回0
。
你好,我想我明白你的意思,但你能写一点点SQL来给我看,只是为了确定吗? – koosa 2011-04-30 06:10:04
我们真的想要推广使用mysql_ *库吗? – 2011-04-30 06:22:27
在用户详细信息表中使用时间戳字段“registertime”。插入数据时,使用NOW()函数插入注册表字段。
当您选择一个随机分钟时,将其转换为unix时间。
获奖者是:SELECT * FROM用户表WHERE registertime> - 您的随机分钟的标记 - ORDER BY registertime LIMIT 1
保持一个小的状态表的地方,记录了先前的平局小时。如果新记录的插入时间在不同的小时,请检查他们是否是赢家。
如果他们是,你用这个新的“赢家”绘制小时更新状态表,这将阻止任何更多的小时抽奖。但是,如果偶然的话,没有人在任何特定时间内真正“赢得”平局会发生什么?你保证赢得注册的最后一个人,或者根本没有赢家?
这看起来很有趣!如果我锁定一个表并且脚本由于某种原因而死亡,那么表将保持锁定状态,还是mysql连接的结尾也会再次解锁所有表? – koosa 2011-04-30 06:13:54
谢谢,这是完美的。喜欢学习这样的东西:) – koosa 2011-04-30 06:21:11
如果客户端会话连接终止,无论是正常还是异常,服务器都会隐式释放会话持有的所有表锁(事务性和非事务性)。你需要注意的是,当表被锁定时,你不会运行一个很长的进程,因为取决于锁的类型,它会阻止对其他查询的访问 – bumperbox 2011-04-30 20:35:36