zoukankan      html  css  js  c++  java
  • php 利用flock来处理并发数据处理

    利用flock()函数对文件进行加锁(排它锁),实现并发按序进行。
    flock(file,lock,block)有三个参数。

    • file:已经打开的文件
    • lock:锁的类型
      LOCK_SH:共享锁(读锁)
      LOCK_EX:独占锁定(排它锁,写锁)
      LOCK_UN:解锁
      LOCK_NB:如果希望在文件锁定时阻塞进程,那么需要加上该参数
    • block:设置为true的时候,锁定文件时,会阻止其他进程
      下面是一个demo:

    阻塞模式(后面的进程会一直等待前面的进程执行完毕)

    $product_id = 1;//获取产品id
    $file = fopen('./lock/lock'.$product_id.'.txt', 'w');
    //加锁
    if(flock($file,LOCK_EX)){
        $number=Db::table('specification')->field('inventory')->where('specification_id','=',1)->find(); // 计数器
        if($number['inventory']>=1){
            //处理订单
            Db::table('specification')->where('specification_id','=',1)->dec('inventory')->update();
            flock($file, LOCK_UN);//释放锁
            fclose($file);
            echo json(['code'=>200,'result'=>'购买成功'])->getContent();die;
        }else{
            flock($file, LOCK_UN);//释放锁
            fclose($file);
            \exception('库存不足',500);
        }
    }
    

    非阻塞模式(只要当前文件有锁存在,那么直接返回)

    $product_id = 1;//获取产品id
    $file = fopen('./lock/lock'.$product_id.'.txt', 'w');
    //加锁
    if(flock($file,LOCK_EX|LOCK_NB)){
        $number=Db::table('specification')->field('inventory')->where('specification_id','=',1)->find(); // 计数器
        if($number['inventory']>=1){
            //处理订单
            Db::table('specification')->where('specification_id','=',1)->dec('inventory')->update();
            flock($file, LOCK_UN);//释放锁
            fclose($file);
            echo json(['code'=>200,'result'=>'购买成功'])->getContent();die;
        }else{
            flock($file, LOCK_UN);//释放锁
            fclose($file);
            \exception('库存不足',500);
        }
    }else{
            \exception('系统繁忙,请稍后再试',500);
    }
    

    来源:https://www.kancloud.cn/mr_y/wechat/1332950

  • 相关阅读:
    HTML DOM教程 14HTML DOM Document 对象
    HTML DOM教程 19HTML DOM Button 对象
    HTML DOM教程 22HTML DOM Form 对象
    HTML DOM教程 16HTML DOM Area 对象
    ubuntu 11.04 问题 小结
    VC6.0的 错误解决办法 小结
    boot.img的解包与打包
    shell里 截取字符串
    从零 使用vc
    Imagemagick 对图片 大小 和 格式的 调整
  • 原文地址:https://www.cnblogs.com/fogwang/p/15730472.html
Copyright © 2011-2022 走看看