今天在做某商城的时候,遇到这样一个问题。甲方要求用户不需要审核直接自动提现。根绝代码相关逻辑,无法实现用户提交申请后就通过,故而在商户管理后台的定时任务中轮询(10秒一次)提现。结果某一用户在并发场景下,重复提现两次。
经过查阅资料,综合考虑,采用文件锁来避免这种情况,实例代码如下:
/**
* thinkphp3.2,其它版本略作改动即可。
* Author: rainy
* DateTime: 2020/06/23 0023 16:12
* 文件锁。
*/
public function file_lock(){
//提前在该文件同级目录下新建一个file_lock.txt文件,
$fp = fopen('file_lock.txt','w+');
$flag = false;
if(flock($fp,LOCK_NB | LOCK_EX)){#非阻塞模式,拿不到锁直接返回。
$list = M('tmp')->where(['state'=>0])->find();#查询数据
sleep(10);
M('test')->where(['scene'=>$list['order_num']])->setInc('text',$list['num']);#更改金额
sleep(10);
M('tmp')->where(['id'=>$list['id']])->save(['state'=>1]);#更改数据状态
$flag = true;
@flock($fp, LOCK_UN);#释放锁
}else{
echo '数据正在处理中,请稍后再试';
}
@fclose($fp);#释放文件资源。
if($flag){
echo '数据处理成功';
}
return ;
}