并发下脏读、更新丢失解决方案之一

浏览:2052 发布日期:2016/09/01 分类:技术分享 关键字: 并发 文件锁 效率 PHP
//方法一      并发下调用接口示例  每次只允许处理一个进程
    public function test1(){
        $id = rand(1,5);
        //先打开一个文件(已经存在的文件可任意模式打开,不存在的文件不能用r和r+模式)
        $fp = fopen(APP_PATH."Lib/Pay/pay_log/test_log.txt","r");
    
        //打开后被访问的文件加独占锁 用以阻塞执行代码期间 其它进程对这个文件的访问 让其它进程处于等待状态
        if(flock($fp,LOCK_EX)){
            //以下进行业务逻辑的处理
            $list = M("test")->where("id={$id}")->find();
            if($list && $list['status']<1){
                $add_data['test_id'] = $id;
                $add_data['time'] = time();
                $add_rus = M("test_log")->add($add_data);
                if($add_rus){
                    $save_data['id'] = $id;
                    $save_data['status'] = 1;
                    $up_rus = M('test')->save($save_data);
                }
            }
            //以上进行业务逻辑的处理
        }
        //关闭文件 释放独占锁 使其它进程继续访问
        fclose($fp);
    }

    //方法二、利用临时文件的锁进行并发控制 根据订单id值的不同,可以同时处理多个不通订单的进程  相同订单并发会被阻塞,需要一个个执行
    public function test2(){
        //接收调用接口时回传的订单id 用以创建文件
        $order_id=empty($_GET['order_id'])?0:$_GET['order_id'];
        
        //先打开一个文件(已经存在的文件可任意模式打开,不存在的文件不能用r和r+模式)
        $file_path = APP_PATH."Lib/Pay/pay_log/test";
        $fp = fopen("{$file_path}/{$order_id}.txt","w");
    
        //打开后给北方网的文件加独占锁  已阻塞 执行代码期间 其它进程对这个文件的访问 让其它进程处于等待状态
        if(flock($fp,LOCK_EX)){
            //处理自己的业务逻辑代码
            $list = M("test")->where("id={$order_id}")->find();
            
            if($list && $list['status']<1){
                $add_data['test_id'] = $order_id;
                $add_data['time'] = time();
                $add_rus = M("test_log")->add($add_data);
                if($add_rus){
                    $save_data['id'] = $order_id;
                    $save_data['status'] = 1;
                    $up_rus = M('test')->save($save_data);
                }
            }        
        }
        fclose($fp);
        //删除临时文件
        unlink("{$file_path}/{$order_id}.txt");
    }
最佳答案
评论( 相关
后面还有条评论,点击查看>>