我开发了一款基于AJAX的游戏,其中引起了一个错误(非常远程,但每小时至少发生一次),由于某种原因,两个请求几乎同时发送到处理页面(我跟踪的最后一个是请求相差.0001毫秒).在执行查询之前会进行一次检查,以确保不会两次执行该查询,但是由于差异很小,因此在执行下一个查询之前检查尚未完成.我很沮丧,如何防止这种情况发生,因为这会导致游戏中出现严重问题.
为了更清楚一点,查询正在游戏中开始新的一轮,所以当它执行两次时,它会同时开始2个回合,这会中断游戏,因此如果需要执行以下操作,我需要能够停止脚本的执行:即使上一轮比赛开始于.0001毫秒之前,上一轮还没有结束.
解决方法:
诀窍是使用原子更新语句来完成两个线程都无法成功执行的操作.它们一定不能都成功,所以您可以简单地执行以下查询:
UPDATE gameinfo SET round=round+1 WHERE round=1234
其中1234是正在进行的当前回合.然后检查受影响的行数.如果该线程影响零行,则它已失败,并且有人事先做了该操作.我假设以上将在自动提交启用时在其自己的事务中执行.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。