高并發(fā)場景下扣庫存的方案

比如商品 goods_id = 1 的商品庫存有10件。100個用戶同時購買,正常情況下只有10個用戶能買到,其它用戶提示庫存不足。

方案一:

set autocommit = 0; begin; select sku from goods_sku where goods_id = 1; if(sku > 0){ update goods_sku set sku = sku - 1 where goods_id = 1; }else{ throw NoEnoughGoodsException(); } commit;
這種方案無法防止超賣。比如庫存還有1,兩個線程同時查到庫存都為1后,做更新操作,這時庫存就為-1了。

方案二

set autocommit = 0; begin; select sku from goods_sku where goods_id = 1 for update; if(sku > 0){ update goods_sku set sku = sku - 1 where goods_id = 1; }else{ throw NoEnoughGoodsException(); } commit;
這種方案防止了超賣,但是每次 select 都加了排他鎖,阻塞其它線程讀。

方案三

set autocommit = 0; begin; int affected = update goods_sku set sku = sku - 1 where goods_id = 1 and sku > 0; if( affected != 1){ throw NoEnoughGoodsException(); } commit;
這種方案解決了上面的問題,但是對數(shù)據(jù)庫的壓力還是很大。

方案四

使用Redis等NoSQL數(shù)據(jù)庫。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 我們通常衡量一個Web系統(tǒng)的吞吐率的指標是QPS(Query Per Second,每秒處理請求數(shù)),解決每秒數(shù)萬...
    威武霸氣你六哥閱讀 473評論 0 0
  • 轉載,覺得這篇寫 SQLAlchemy Core,寫得非常不錯。不過后續(xù)他沒寫SQLAlchemy ORM... ...
    非夢nj閱讀 5,487評論 1 14
  • 一、數(shù)據(jù)庫操作: 1.1 創(chuàng)建數(shù)據(jù)庫: create database student; 1.2 刪除數(shù)據(jù)庫: ...
    __71db閱讀 797評論 0 0
  • 第1章 初涉MySQL 1.1 MySQL文件 (1)MySQL目錄結構 (2)MySQL配置向導文件(安裝后配置...
    凜0_0閱讀 820評論 1 0
  • 數(shù)據(jù)庫基礎知識 數(shù)據(jù)庫客戶端MySQL作為數(shù)據(jù)庫服務器來運行,任何滿足mysql通信規(guī)范的軟件都可以作為客戶端來連...
    littlexjing閱讀 921評論 0 2