您现在的位置是:首页 > 文章详情  网站首页文章详情

php高并发下减库存的操作

  • Administrator
  • 1120
  • 2020-04-24 10:11:09
  • PHP语言
简介对于减库存的几种操作方法 优化方案1: 将库存字段number字段设为unsigned,当库存为0时,因为字段不能为负数,将会返回false 优化方案2: 使用mysql的事务,锁...

对于减库存的几种操作方法

优化方案1:

将库存字段number字段设为unsigned,当库存为0时,因为字段不能为负数,将会返回false

优化方案2:

使用mysql的事务,锁住操作的行

//模拟下单操作
//库存是否大于0
mysql_query("BEGIN");   //开始事务
$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id' FOR UPDATE";//此时这条记录被锁住,其它事务必须等待此次事务提交后才能执行
$rs=mysql_query($sql,$conn);
$row=mysql_fetch_assoc($rs);
if($row['number']>0){
    //生成订单 
    //库存减少
    $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";
    $store_rs=mysql_query($sql,$conn);  
    if(mysql_affected_rows()){  
        insertLog('库存减少成功');
        mysql_query("COMMIT");//事务提交即解锁
    }else{  
        insertLog('库存减少失败');
    }
}else{
    insertLog('库存不够');
    mysql_query("ROLLBACK");
}

优化方案3:

使用非阻塞的文件排他锁

$fp = fopen("lock.txt", "w+");
if(!flock($fp,LOCK_EX | LOCK_NB)){
    echo "系统繁忙,请稍后再试";
    return;
}
//下单
$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'";
$rs=mysql_query($sql,$conn);
$row=mysql_fetch_assoc($rs);
if($row['number']>0){//库存是否大于0
    //模拟下单操作 
    //库存减少
    $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";
    $store_rs=mysql_query($sql,$conn);  
    if(mysql_affected_rows()){  
        insertLog('库存减少成功');
        flock($fp,LOCK_UN);//释放锁
    }else{  
        insertLog('库存减少失败');
    } 
}else{
    insertLog('库存不够');
}
fclose($fp);

优化方案4:

使用redis队列,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用(mysql事务在高并发下性能下降很厉害,文件锁的方式也是) redis不提供实例

文章评论

Top