PHP、mysql和并发更新

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

您好,我有一个浏览器游戏,其中不同的玩家安排的行动可以持续一个或两个小时。cronjob每分钟检查一次所有已完成的操作(endtime在这种情况下,我使用一个新列,例如:marktothetable character_actions)

然后在作业开始时,我将此查询称为:

$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  ";