生產環境中遇到併發過高,導致庫存買超的情況。
可以通過以下幾種情況解決:
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.降級需求,分散用戶活躍時間
如果用戶一直未支付,放到未支付的隊列裏面,把相應的庫存補回來