PHP、mysql和并发更新
您好,我有一个浏览器游戏,其中不同的玩家安排的行动可以持续一个或两个小时。cronjob每分钟检查一次所有已完成的操作(endtime在这种情况下,我使用一个新列,例如:marktothetable character_actions) 然后在作业开始时,我将此查询称为:PHP、mysql和并发更新,mysql,concurrency,innodb,Mysql,Concurrency,Innodb,您好,我有一个浏览器游戏,其中不同的玩家安排的行动可以持续一个或两个小时。cronjob每分钟检查一次所有已完成的操作(endtime在这种情况下,我使用一个新列,例如:marktothetable character_actions) 然后在作业开始时,我将此查询称为: $uniqueid = time(); $sql="update character_actions set mark = '$uniqueid' where status = 'running' and endtime &l
$uniqueid = time();
$sql="update character_actions set mark = '$uniqueid' where status = 'running' and endtime <= unix_timestamp() AND mark is NULL ";
这种方法有一个局限性,它启动不同的并行工作,这会降低机器的速度,从而导致更多的延迟和更多的并行工作
可以通过引入限制来解决:
$lim= 100 ; // tune to finish the job in 60 seconds
$sql="update character_actions set mark = '$uniqueid' where status = 'running' and endtime <= unix_timestamp() AND mark is NULL limit $lim ";
$lim=100;//调整以在60秒内完成作业
$sql=“update character\u actions set mark='$uniqueid'其中status='running'和endtime Ok,我想这会起作用,因为下一个cronjobs将获得一组单独的查询。谢谢,我将尝试这个想法。
$sql = "select * from
character_actions
where status = 'running'
and mark = '$uniqueid'";
$result = $db -> query ( $sql ) ;
$lim= 100 ; // tune to finish the job in 60 seconds
$sql="update character_actions set mark = '$uniqueid' where status = 'running' and endtime <= unix_timestamp() AND mark is NULL limit $lim ";