生产环境中遇到并发过高,导致库存买超的情况。
可以通过以下几种情况解决:
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.降级需求,分散用户活跃时间
如果用户一直未支付,放到未支付的队列里面,把相应的库存补回来