计划任务文件锁

使用场景

使用计划任务执行收益分配等需要修改状态的操作,当网站数据量或并发量较大导致程序或者数据库阻塞,以至于当前任务未完成时,第二个任务已经开始运行。此时前一个任务从数据库读取到的待执行数据的状态可能还没有改变,两个任务可能会读取重复的需要操作的待执行信息列表,导致重复分配等后果
此时我们需要保证在前一个任务未执行结束时,第二个任务不开始或者不执行。计划任务的执行是由操作系统控制,我们不好操作;我们便于操作的是脚本文件,可以使脚本不执行

思路

思路一:行锁
对于更新数据的计划任务,我们可以修改过程放在事务中,给要修改的行加行锁,commit之后,释放行锁。后面的有计划任务的话,只能等待当前任务结束,才有权限读取行,不会重复修改

思路二:文件锁
对于实时执行的插入操作,为了防止并发请求接口,造成的数据重复问题,可使用文件锁
基本思路是使用php自带的 flock 文件锁函数,当方法开始时,给文件上锁,结束后解锁。另外一个请求到来时,判断文件是否已解锁,未解锁则跳过执行程序

文件锁 步骤
//首先建立一个文件作为脚本的替代文件,因为不能直接在文件内给当前文件加锁
//通过判断替代文件的锁定状态来决定脚本执行与否
$fp = fopen('file_lock.txt', "r");//打开文件
// 加锁
if(flock($fp, LOCK_EX)){
    //加锁成功,说明文件之前未锁定,执行操作
    ......
    //执行完毕后,解锁文件
    flock($fp,LOCK_UN);
}else{
    //加锁失败,说明文件未解锁,跳过执行操作
    echo 'no act';
}
fclose($fp);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值