生产环境中遇到并发过高,导致库存买超的情况。
可以通过以下几种情况解决:
1.使用数据库锁机制防止并发
方法1 select for update;
update set stock = stock - x;
insert into order_list(order_id) values (1);
方法2 return = update set stock = stock -x where category_id = 1 and stock - x > 0;
if !return exit;
2.使用zk等分布式锁
3.借助文件排他锁,在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙"
阻塞(等待)模式
|
<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
//..处理订单
flock($fp,LOCK_UN);
}
fclose($fp);
?>
|
非阻塞模式
|
<?php
$fp
=
fopen
(
"lock.txt"
,
"w+"
);
if
(
flock
(
$fp
,LOCK_EX | LOCK_NB))
{
//..处理订单
flock
(
$fp
,LOCK_UN);
}
else
{
echo
"系统繁忙,请稍后再试"
;
}
fclose(
$fp
);
?>
|
4.使用排队等待机制顺序处理
5.使用redis等单线程处理机制
如果依然扛不住流量怎么办
1.拆分锁的粒度
2.降级需求,分散用户活跃时间
如果用户一直未支付,放到未支付的队列里面,把相应的库存补回来