Skip to content Skip to sidebar Skip to footer

今天在做某商城的时候,遇到这样一个问题。甲方要求用户不需要审核直接自动提现。根绝代码相关逻辑,无法实现用户提交申请后就通过,故而在商户管理后台的定时任务中轮询(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 ;
    }

Leave a comment