成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

系統重試,導致庫存扣多啦,怎么辦(兩行代碼破解)?

開發 架構
大家有沒有遇到過,庫存異常的情況?接下來,就今天和大家聊一聊庫存扣減里的方案設計。

大家有沒有遇到過,庫存異常的情況:

  • 系統重試,導致庫存扣了多次;
  • 系統并發,導致庫存設置錯誤;

今天和大家聊一聊庫存扣減里的方案設計。

庫存微服務一般提供什么接口?

提供庫存的查詢、扣減、設置等RPC接口:

  • 庫存查詢接口,微服務一般執行:
select num from stock where sid=$sid
  • 庫存扣減接口,微服務一般執行:
update stock set num=num-$reduce where sid=$sid
  • 庫存設置接口,微服務一般執行:
update stock set num=$num_new where sid=$sid

庫存操作,一般是什么業務場景?

用戶下單前,一般會對庫存進行查詢,有足夠的存量才允許扣減:

如上圖所示,通過查詢接口,得到庫存是5。

用戶下單時,接著會對庫存進行扣減:

如上圖所示,購買3單位的商品,通過扣減接口,最終得到庫存是2。

簡言之,一般是“先查后減”。

庫存“先查后減”會遇到什么問題?

系統往往有重試機制,這個重試機制可能實現在系統底層,例如:服務連接池重試,數據庫連接池重試,業務代碼不可控。

如果通過扣減接口來修改庫存,在重試時會導致重復扣減:

如上圖所示,try和retry,導致一次扣減執行兩次,最終得到一個錯誤庫存。

如何解決“重試導致庫存異常”的問題?

這里的根本原因:“reduce”操作是一個非冪等的操作,不能夠重復執行,可以升級為“set”操作:

如上圖所示,同樣是購買3單位的商品,通過set操作,即使有重試機制,也不會得到錯誤的庫存,“set”操作是一個冪等操作。

因此,應該“先查后設”。

庫存“先查后設”會遇到什么問題?

并發量很大時,還是可能導致庫存異常:

如上圖所示,兩個并發的操作,查詢庫存,都得到了庫存是5。

接下來多個用戶發生了并發的購買動作:

畫外音:秒殺類業務特別容易出現。

如上圖所示:

  • 用戶1購買了3個庫存,庫存要設置為2;
  • 用戶2購買了2個庫存,庫存要設置為3;
  • 這兩個設置庫存的接口并發執行,庫存會先變成2,再變成3,導致數據不一致(實際賣出了5件商品,但庫存只扣減了2,最后一次設置庫存會覆蓋和掩蓋前一次并發操作);

如何解決“并發導致庫存異常”的問題?

這里的根本原因:設置操作發生的時候,沒有檢查庫存與查詢出來的庫存有沒有變化,理論上:

  • 庫存為5時,用戶1的庫存設置才能成功;
  • 庫存為5時,用戶2的庫存設置才能成功;

實際執行的時候:

  • 庫存為5,用戶1的set stock 2確實應該成功;
  • 庫存變為2了,用戶2的set stock 3應該失敗掉;

畫外音:有條件的成功。

接口實現優化升級,將庫存設置接口執行的:

update stock set num=$y where sid=$sid

升級為:

update stock set num=$num_new where sid=$sid 
and num=$num_old

畫外音:加了一個初始條件比對。

簡言之,“先查后設,有條件的設”。

這正是大家常說的“Compare And Set”(CAS),是一種常見的降低讀寫鎖沖突,保證數據一致性的方法。

總結

  • “先查后減”,在重試,并發的場景下,容易出現異常;
  • “先查后設”,冪等性優化,能夠解決重試的問題;
  • “先查后設,有條件的射”,CAS優化,能夠解決并發的問題;

知其然,知其所以然。

思路比結論更重要。

責任編輯:趙寧寧 來源: 架構師之路
相關推薦

2013-03-05 17:11:27

Win 7操作系統藍屏

2023-09-12 14:58:00

Redis

2021-06-18 10:12:09

JS代碼前端

2017-06-15 08:02:02

庫存扣減查詢

2024-02-20 12:49:00

CSS函數前端

2022-07-14 10:23:39

數據

2022-09-25 23:10:53

Python數據集機器學習

2021-11-28 21:26:39

Windows 7Windows微軟

2024-06-12 15:59:59

前端JavaScrip識別

2022-05-17 07:35:13

安全Session

2018-03-15 13:31:48

潤乾LinuxGREP搜索

2013-01-29 13:22:24

系統服務

2022-11-18 07:40:57

2021-05-08 23:33:12

iOS蘋果系統

2019-06-06 10:04:45

重構代碼原代碼

2021-01-15 05:36:48

MySQL錯位數據庫

2009-11-03 08:56:02

linux死機操作系統

2024-04-22 08:17:23

MySQL誤刪數據

2022-12-19 11:31:57

緩存失效數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产高清一区二区三区 | 成av在线 | 乱一性一乱一交一视频a∨ 色爱av | 日本在线免费视频 | 欧美精品综合 | 午夜精品一区二区三区在线观看 | 国产精品99久久久久久人 | 久久av资源网 | 亚洲久久一区 | 国产乱码高清区二区三区在线 | 国产精品久久久久久久久久 | 岛国av免费在线观看 | 97日日碰人人模人人澡分享吧 | 日日摸夜夜添夜夜添特色大片 | 蜜桃视频麻豆 | www国产成人免费观看视频,深夜成人网 | 91在线精品视频 | 四虎影视免费观看 | 国产精品免费一区二区三区四区 | 久久综合久色欧美综合狠狠 | 国产精品自拍视频网站 | 91精品国产一区二区三区 | 精品欧美一区二区在线观看视频 | 91精品国产一区二区三区动漫 | 在线小视频 | 2021狠狠天天天 | 91精品国产乱码久久久久久久久 | 欧美美女被c | 久久久九九 | 亚洲成人精品 | 美国十次成人欧美色导视频 | 亚洲精品一区二区另类图片 | 国产精品高潮呻吟久久 | 亚洲一区精品视频 | 男女羞羞视频网站 | av天天干| 国产成人jvid在线播放 | 视频一区在线观看 | 91社区在线观看高清 | 久久精品小视频 | 久久精品69 |