使用文件锁解决高并发(超卖现象)

其实解决高并发并不难有很多种解决方案 文件锁就是其中一种
你需要先了解一下什么是文件锁 百度一大堆这里就不细说了
首先说一下原理:
高并发无非就是多人同时请求一条数据 而数据库反应不过来造成多个同样的数据,这个问题很大

而利用文件锁解决高并发只需要利用独占锁与(非阻塞:看你个人或者业务)

先利用一个文件 设置一个独占锁 每次一个请求便锁上 非阻塞可以使后面的数据发现有独占锁是便停止请求 代码附上(记得添加上事务,事务很重要):
header("content-type:text/html;charset=utf8");
$link = mysqli_connect("127.0.0.1","root","root","comm");
$fp = fopen("lock.txt", "a");

if(flock($fp,LOCK_EX | LOCK_NB)){ //设置独占锁 添加非阻塞
    mysqli_query($link,'START TRANSACTION');//开启事务
    $id = $_GET["id"]; //商品id

    $sql = "select * from commodity where id = '{$id}'";
    $data = mysqli_fetch_assoc(mysqli_query($link,$sql));
    $num = $data["num"]; //查询商品库存

    if ($num <= 0){ //判断库存是否还有剩余
        echo json_encode(["code"=>2,"msg"=>"商品已经被抢购完了!"]);
    }else{
        $num -= 1; //存在商品库存减一
        $sql = "update commodity set num={$num} where id= {$id} ";
        mysqli_query($link,$sql); //修改库存
        if (mysqli_affected_rows($link) < 1){
            mysqli_query($link,'ROLLBACK'); //事务回滚
            echo json_encode(["code"=>1,"msg"=>"抢购失败,修改"]);
            flock($fp,LOCK_UN); //当失败时释放文件锁
            die;
        }
        $order_from = "jd-".time()."x".$num; //设置订单号
        $time = time(); //订单创建时间
        $sql = "insert into orders(id,`order`,create_time) values({$id},'{$order_from}','{$time}')"; //添加订单
        mysqli_query($link,$sql);
        if (mysqli_affected_rows($link) < 1){
            mysqli_query($link,'ROLLBACK');//事务回滚
            echo json_encode(["code"=>1,"msg"=>"抢购失败,插入"]);
            flock($fp,LOCK_UN); //当失败时释放文件锁
            die;
        }
        mysqli_query($link,'commit');//事务提交
        echo json_encode(["code"=>1,"msg"=>$order_from]);
    }
    flock($fp,LOCK_UN); //程序走完释放文件锁
}
fclose($fp);
unset($res);
mysqli_close($link);
//记得添加事务,事务很重要

你可能感兴趣的:(文件锁,高并发)