Php 网络游戏并发控制
还有一些关于并发性的其他问题,但它们并没有完全解决我的场景 让我们假设我有一个游戏,在这个游戏中,用户彼此互动,打架等等。在任何给定的时间,一个玩家都可能与其他玩家进行多次互动,所有玩家都可以看到事件的发生。当这些玩家中的任何一个访问该站点时,它需要更新所涉及的任何数据,并将其显示给用户 示例场景:玩家A和玩家B在战斗,在这场战斗中每隔几分钟就会发生一次事件。同时,玩家A也在与玩家C互动。由于愚蠢的运气,两次互动的事件恰好在同一秒发生 当第二个到达时,由于再次愚蠢的运气,玩家B和玩家C同时访问该站点,以检查他们与玩家A的战斗状态。战斗需要更新关于玩家A的信息。如果我没有正确编码,A的数据可能会混乱 在这种情况下,我有两个游戏,每个游戏都有不同的解决方案和不同的问题。其中一个使用锁,因此当用户访问站点时,他们会在db行上获取锁,读取成功获取的锁的数据,然后写入更改并释放锁。但有时,由于未知的原因,这会失败,锁会永远卡住,用户抱怨,我们不得不手动修复它。我的另一个游戏使用守护进程来执行这些事务,这使得问题(几乎)没有意义,因为只有一个进程进行了这些更改。但玩家仍然可以在同一时间做其他事情,并可能导致同样的问题 我读过一些关于这方面的不同解决方案,比如乐观或基于时间戳的控制。我想问:Php 网络游戏并发控制,php,database,web-applications,concurrency,Php,Database,Web Applications,Concurrency,还有一些关于并发性的其他问题,但它们并没有完全解决我的场景 让我们假设我有一个游戏,在这个游戏中,用户彼此互动,打架等等。在任何给定的时间,一个玩家都可能与其他玩家进行多次互动,所有玩家都可以看到事件的发生。当这些玩家中的任何一个访问该站点时,它需要更新所涉及的任何数据,并将其显示给用户 示例场景:玩家A和玩家B在战斗,在这场战斗中每隔几分钟就会发生一次事件。同时,玩家A也在与玩家C互动。由于愚蠢的运气,两次互动的事件恰好在同一秒发生 当第二个到达时,由于再次愚蠢的运气,玩家B和玩家C同时访问该
我认为你所寻找的已经包含在你的问题中:交易。 如果您使用的是MySQL,则需要使用innoDb引擎设置表,以便能够使用事务。一些文件:
如果可以的话,不要尝试重新发明轮子。但是,在我读取要修改的数据后,其他人不能在我进行计算时修改数据吗?在提交事务之前,我必须手动验证数据是否未被更改,但验证和提交本身并不是原子的。或者我的查询应该是“更新,其中所有数据都是我期望的”,如果我得到0行受影响的数据,我知道我需要重试?啊-选择更新。第二次也是如此。我必须修改ORM中的一些内容。对于问题4-我不需要重试,因为它将始终读取最新数据?问题是,由于php的单请求操作模式,用户可能会看到一些东西(第一个请求),并在另一个用户完成其他事情后进行操作。但他们通常知道这是可能发生的(这就是为什么在某些游戏中,你会让大F5用户几乎实时地检查正在发生的事情:p),但只要你在任何计算之前启动一个事务,并在最后提交或回滚这些事务,如果你在执行操作之前检查是否满足了执行某些操作的条件,你就不会有问题。