欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysq詳細(xì)講解如何解決庫(kù)存并發(fā)問(wèn)題

 更新時(shí)間:2022年05月21日 09:07:48   作者:會(huì)噴火才能叫火山  
這篇文章主要為大家詳細(xì)介紹了如何使用Mysq解決庫(kù)存并發(fā)問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

面臨的問(wèn)題

長(zhǎng)話短說(shuō),假設(shè)我們現(xiàn)在面臨以下需求

  1. 商品的庫(kù)存有兩千,賣(mài)完為止
  2. 某商品本日的售賣(mài)只允許賣(mài)出一百,賣(mài)完為止

如何實(shí)現(xiàn)

我提出的方案也很簡(jiǎn)單,使用樂(lè)觀鎖的方式。

以下是具體的方案

-- stock: 當(dāng)前庫(kù)存數(shù) number:扣減的數(shù)量 -- 
 UPDATE t SET stock -= number WHERE stock >= number

外加上事務(wù),便可以實(shí)現(xiàn)一個(gè)基本的庫(kù)存扣減操作。大部分情況下,無(wú)需擔(dān)心所謂的“并發(fā)問(wèn)題”。事務(wù)具有的特性,會(huì)在此處幫你解決的掉這個(gè)大難題。

(簡(jiǎn)單的說(shuō):事務(wù)會(huì)在執(zhí)行 非查詢 的操作的時(shí)候,會(huì)實(shí)現(xiàn)類(lèi)似鎖的功能。直到前面的事物提交或者回滾之前,后續(xù)的操作都會(huì)被掛?。?/p>

需求具體實(shí)現(xiàn)的方案

1.商品的庫(kù)存兩千,賣(mài)完為止

其實(shí)從理論上,想解決這個(gè)問(wèn)題,只依靠上文之中的update語(yǔ)句便可以完成。

具體步驟如下:

  1. 執(zhí)行UPDATE 語(yǔ)句,查看其結(jié)果 。
  2. 若是,則執(zhí)行后續(xù)操作
  3. 若否,代碼回滾

具體代碼如下

//開(kāi)始事務(wù)
beginTransaction();
// 扣減庫(kù)存前的業(yè)務(wù)
// 執(zhí)行扣減庫(kù)存操作
boolean reduceStockSuccess = reduceStock();
if(!reduceStockSuccess){
	//扣減庫(kù)存失敗,代碼回滾
	rollback();
	return;
}
// 執(zhí)行扣減庫(kù)存后的業(yè)務(wù)操作
//記錄庫(kù)存
writeRecod();
//提交事務(wù)
commit();
return;

雖然,程序其實(shí)如此便可。但是從個(gè)人的角度去看,我還是建議大家多做一點(diǎn)校驗(yàn),以減少UPDATE程序運(yùn)行次數(shù)。

就比如說(shuō),我們可以在前面加一個(gè)查詢當(dāng)前庫(kù)存數(shù)量代碼。

主要的目的在于,雖然這個(gè)校驗(yàn)代碼,不能說(shuō)百分百的解決問(wèn)題 ,擋住所有的流量。但是卻可以擋住大部分無(wú)意義的流量,調(diào)用UPDATE的次數(shù)。

簡(jiǎn)單來(lái)說(shuō),就跟我們小時(shí)候玩坦克大戰(zhàn)一樣,雖然我們玩家不能擋住所有的進(jìn)攻者。但也并不是隨隨便便誰(shuí)都可以往我們家基地開(kāi)炮。

//開(kāi)始事務(wù)
beginTransaction();
// 扣減庫(kù)存前的業(yè)務(wù)
int stock = getStock();
if(stock <= 0 ){
	//庫(kù)存不足,退出程序
	rollback();
	return;
}
// 執(zhí)行扣減庫(kù)存操作
boolean reduceStockSuccess = reduceStock();
if(!reduceStockSuccess){
	//扣減庫(kù)存失敗,代碼回滾
	rollback();
	return;
}
// 執(zhí)行扣減庫(kù)存后的業(yè)務(wù)操作
//記錄庫(kù)存
writeRecod();
//提交事務(wù)
commit();
return;

2 . 日庫(kù)存數(shù)一百 , 賣(mài)完為止

該需求相比1來(lái)說(shuō),問(wèn)題在于。單從庫(kù)存表,記錄表來(lái)說(shuō)。除非我們?cè)谛略龅接涗洷淼腟QL里面將每日庫(kù)存數(shù)100接入。否則,我們無(wú)法通過(guò)事務(wù)與SQL來(lái)幫我們解決并發(fā)問(wèn)題。

但是我們又不可能在記錄購(gòu)買(mǎi)信息的代碼內(nèi),每日庫(kù)存數(shù)100的邏輯耦合進(jìn)去。

因此,這個(gè)問(wèn)題對(duì)于MYSQL來(lái)說(shuō)是個(gè)死局。

若想單靠MYSQL之力若想破局,我們只能依靠將每日庫(kù)存數(shù)的這個(gè)邏輯,專(zhuān)門(mén)設(shè)計(jì)一張數(shù)據(jù)表。

如設(shè)計(jì)一張商品每日購(gòu)買(mǎi)數(shù)量記錄表記錄某個(gè)商品每日被購(gòu)買(mǎi)的數(shù)量。

在每次購(gòu)買(mǎi)的時(shí)候都更新一下本日購(gòu)買(mǎi)的數(shù)量

 UPDATE day_t SET day_stock += number WHERE day_stock + number <= 100

雖然能解決需求問(wèn)題,但是表現(xiàn)出來(lái)的問(wèn)題依然是業(yè)務(wù)耦合進(jìn)公關(guān)表內(nèi)。

  • 每日購(gòu)買(mǎi)數(shù)量表,不應(yīng)當(dāng)僅僅為每日購(gòu)買(mǎi)上限服務(wù)。當(dāng)前的解決問(wèn)題的方案,等同于解決問(wèn)題的同時(shí)又制造了一個(gè)差不多的問(wèn)題。只是一個(gè)問(wèn)題轉(zhuǎn)移到了其他部分出問(wèn)題
  • 即使我們?yōu)樵撔枨髮?zhuān)門(mén)創(chuàng)建一張表,但是隨著后續(xù)的數(shù)據(jù)表越來(lái)越多,程序的管理性卻越來(lái)越差,比如后續(xù)還會(huì)出現(xiàn)周限制,月限制,年限制等等等等。

總結(jié)

現(xiàn)在我們可以看出,使用MYSQL的方式雖然簡(jiǎn)單,但是卻有著非常大的局限性。

但這里也并不是說(shuō)某些方案一定好,卻也一定差。

主要看當(dāng)前的業(yè)務(wù),MYSQL的方式,適用于最底層。適合完成某個(gè)業(yè)務(wù)最原始的功能。

到此這篇關(guān)于Mysq詳細(xì)講解如何解決庫(kù)存并發(fā)問(wèn)題的文章就介紹到這了,更多相關(guān)Mysq庫(kù)存并發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論