又谈php+mysql并发数据出错问题

最近,项目中的所有crond定时尽量取消,改成触发式。

比如每日6点清理数据。

原来的逻辑,写一个crond定时搞定

现在改为触发式

6点之后第一个玩家/用户  进入,才开始清理数据。

出现了一个问题

1 如何确保第一个玩家触发?

update xxx set shijian = date('Y-m-d',time()-6*3600)   返回为0   则表示已有人触发过  返回1  表示第一个玩家 触发

这又出现了一个问题:

第一个人进入,触发清理数据。

第二个人进入,进入正常数据操作,但是第一个人触发的清理数据操作也许并未完成。第二个玩家操作的数据可能被清理数据清理掉,如何防止??

最后总结了一套比较可行的方案:

$t = date(Y-m-d,time()-3600*6);
if(  执行sql'update  xxx set sj_start = $t'返回的0|1 ) {
    更新操作
    sj_end=今天
}

if( sj_end = 今天 ){
    正常操作流程
}else{
    echo '正在更新操作,请稍后';
}



原文地址:https://www.cnblogs.com/phper007/p/3512449.html