繁体   English   中英

您将如何构造此php-mysql查询?

[英]How would you construct this php - mysql query?

我正在做一个基于回合的游戏,并试图构建一个匹配功能,当玩家选择与一个随机的对手一起玩时。 我是MySQL的菜鸟,所以我需要一些帮助。

我正在考虑这样做:

  1. 当玩家选择与随机对手对抗时,请查看“ waiting_list”表以查看是否有对手。

  2. 如果没有对手,则将玩家添加到等待名单中。

  3. 如果在等待名单上有一个对手,从名单上删除该玩家,然后与其他玩家开始游戏。

我担心的是,如果我这样做,那么候补名单上的同一位选手是否有可能会被几位选手选中。 想象一下,如果有100,000名玩家选择了自动匹配功能,那么数据库(phpmyadmin)是否可以正常处理? 您将如何构建逻辑?

谢谢

我担心的是,如果我这样做,那么候补名单上的同一位选手是否有可能会被几位选手选中。

用1.)到3.)要点描述的是所谓的“业务交易”,这里有一个原子操作,一次只能由一个玩家执行。

因此,您应该将操作封装到处理它的对象中,以便在业务逻辑中有一个接口可以执行该事务。

然后,您需要实施交易。 事务可以成功或失败,您可以使用返回值或异常来处理失败。

交易本身必须确保消除您的顾虑。 在MySQL中,可以通过排他地锁定比赛表,进行比赛,删除播放器/对手或将其添加到等待列表并释放锁定来完成。

12.3.5。 LOCK TABLESUNLOCK TABLES语法文件

表锁具有性能影响,因为只要表被锁定,其他会话就无法访问它(等待直到锁被释放)。

因此,保持锁定时间短是明智的。 如果事务需要10毫秒,则可以将其乘以并发活动事务的数量,以及时表示性能:

0.010 seconds * 100 000 transactions = ~ 16.7 minutes

请注意,您不可能有10万个并发交易,因为并非所有玩家都一次匹配。 但是,您需要跟踪数字,因为一段时间后系统可能会停顿。

为了帮助防止单个玩家进入多个游戏,您可以为等待列表添加“ GameIDAssigned”的附加列(如果尚未添加),默认为0(甚至是PlayAgainstPerson)。

在查询可用于并显示给许多玩家的数据时,记录可能都具有相似的时间戳,但您只需要1。因此,以某种随机方法选择一个,然后在等于时间戳且没有游戏的情况下分配ID分配。 如果返回1条记录已更新,则为您的记录。 如果已将其分配给其他人,则将填写GameIDAssigned,从而防止您再次进行分配。 如...

PersonIDFromWaitingList = SomeValueEvenIfBySQLSubSelect

Update YourWaitingListTable
   set GameIDAssigned = SomeCurrentGameIDSequence
   where DateTimeStampColumn = ValueWhenOriginallyQueried
     AND GameIDAssigned = 0

在没有看到游戏结构或表格列的任何其他元素的情况下,我目前无法提供更多功能,但是希望您能充分理解。 如果试图同时由多个人分配一个候补名单人,则只有第一个完成更新的人(而gameIDAssigned仍为0)获胜,而其他尝试获取该人的人将错过并需要尝试下一个可用...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM