首先在MySQL表中将商品库存字段设置为无符号及不能为负数。
1.php+redis(需要独立服务器)
在后台设置商品抢购时,将商品信息加入到redis中,
$store=1000; 参与抢购的商品数量
$goodsid=1;商品ID
$spec=2;商品规格Id
$redis=new Redis();
$result=$redis->connect('127.0.0.1',6379);连接redis
for($i=0;$i<$store;$i++){
$redis->lpush("goods_store_".$good side."_".$sepc,1);
}
前端抢购API
$redis=new Redis();
$result=$redis->connect('127.0.0.1',6379);
$count=$redis->lpop('("goods_store_".$good side."_".$sepc,1);
});
if(!$count){
弹出商品已经抢完的提示信息
return FALSE;
}
之后组合订单信息,存入到数据库中保存
2.php+Mysql 事务(适合云虚拟主机,无法安装redis的服务器)
mysql_query("BEGIN"); 开始事务
$sql="select number from store where goodsid='$goodsid' and spec='$spec' FOR UPDATE";
此时这条记录被锁住,其它事务必须等待此次事务提交后才能执行
$rs=mysql_query($sql);
if($row['number']>0){
商品数量大于0时生成订单
$order_sn=build_order_no();
$sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price)
values('$order_sn','$user_id','$goods_id','$sku_id','$price')";
$order_rs=mysql_query($sql,$conn);
//库存减少
$sql="update 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{
'库存减少失败';
}
}else{
mysql_query("ROLLBACK")
事务回滚,当MySQL操作有一个失败时之前的所有操作会被撤回。
return FALSE;
}
留言与评论(共有 0 条评论) “” |