原因
兩個(gè)人同時(shí)購(gòu)買(mǎi)同一件商品,會(huì)產(chǎn)生超賣(mài)問(wèn)題溅漾。
解決
-
表設(shè)計(jì)
無(wú)符號(hào)的表設(shè)計(jì)(unsigned)。在設(shè)計(jì)表的時(shí)候著榴,把字段設(shè)置成無(wú)符號(hào)添履,即庫(kù)存小于0的話,就會(huì)報(bào)錯(cuò)
處理:在進(jìn)行商品的庫(kù)存減少的時(shí)候脑又,不要先查再更新暮胧,直接更新庫(kù)存锐借。 -
使用鎖 耗費(fèi)資源
1.悲觀鎖
select * from table_name for update
2.樂(lè)觀鎖
update sku set stock = 1 where id = ? and stock = 1
假設(shè)現(xiàn)在庫(kù)存只有1件了 -
redis隊(duì)列 使用List類(lèi)型
舉例:iphoneX這件商品有100個(gè)庫(kù)存,把商品的id向redis的list類(lèi)型中壓棧100次(把id存入100次)往衷,下單的時(shí)候詢問(wèn)時(shí)候有庫(kù)存钞翔,判斷的方式是是否能POP出數(shù)據(jù)