您现在的位置是:首页 > 文章详情 网站首页文章详情
php高并发下减库存的操作
- 1120
- 0
- 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不提供实例
上一篇: php检查redis是否连接成功
下一篇: redis的常用操作