成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

node.js - nodejs單進(jìn)程產(chǎn)生的數(shù)據(jù)庫(kù)連接多線程并發(fā)問(wèn)題探討

瀏覽:124日期:2022-06-17 13:59:15

問(wèn)題描述

舉例,假設(shè)有100個(gè)請(qǐng)求node服務(wù)器,每個(gè)請(qǐng)求會(huì)執(zhí)行一次查詢,修改數(shù)據(jù)庫(kù)操作。假設(shè)10個(gè)請(qǐng)求按順序被node接收處理 等待各自判定庫(kù)存查詢數(shù)據(jù)庫(kù)io操作,但是庫(kù)存只有5個(gè),問(wèn)題來(lái)了,這時(shí)候10個(gè)查詢都判定庫(kù)存還有,然后繼續(xù)下面的下單操作。當(dāng)100個(gè)請(qǐng)求甚至更多時(shí),問(wèn)題會(huì)被更加放大 又不能同步加鎖,哪位朋友有比較合理的思路 不吝賜教~

問(wèn)題解答

回答1:

站內(nèi)搜“搶購(gòu)”https://segmentfault.com/sear...

極端情況為“秒殺”https://segmentfault.com/sear...

回答2:

你這種情況應(yīng)該加上事務(wù)

----- 更新下答案 -----

查詢和實(shí)際數(shù)據(jù)不一致的問(wèn)題是無(wú)法避免的,我的理解題主的意思應(yīng)該是在更新callback之前有其他用戶購(gòu)買成功的情況會(huì)導(dǎo)致購(gòu)買失敗的問(wèn)題,因此可以通過(guò)加鎖解決,其實(shí)如果異步操作都使用 promise 的情況下,可以通過(guò)Promise 模擬順序調(diào)用來(lái)實(shí)現(xiàn)類似java方法加鎖的特性

通過(guò) decorator 對(duì)返回 promise 的方法實(shí)現(xiàn)類似java synchronized 關(guān)鍵字的同步調(diào)用

// decoratorlet pfunction sync(target, name) { const method = target[name] target[name] = function(...args) { if (p) { p = p.then(() => method.apply(target, args)) } else { p = method.apply(target, args) } return p }}class Model { constructor () { // super() this._cardCount = 5 sync(this, ’buyOneCard’) } // @sync // 注解需要編譯,暫時(shí)手動(dòng)調(diào)用下 buyOneCard (user) { console.log(’buyonecard’, this._cardCount) return new Promise((resolve, reject) => { setTimeout(() => {this._cardCount = --this._cardCount this._cardCount < 0 ? reject(this._cardCount) : resolve(this._cardCount) }, 100) }) }}const m = new Model()for(let i=0;i<10;i++) m.buyOneCard().then(c => console.log(c))

chrome 下運(yùn)行通過(guò)。。

----- 再更新 ----

github 上已經(jīng)有類似工具h(yuǎn)ttps://github.com/sindresorh...

回答3:

謝謝樓上兩位,首先我描述的場(chǎng)景是正常商品銷售,如果是搶購(gòu)倒好辦 直接用redis隊(duì)列可以解決,但是商品種類多的時(shí)候 這種方式不可取。

回復(fù)樓上,這里面事務(wù)是肯定有的,但是事務(wù)并不能解決這種并發(fā)超賣的情景。 最后,如果這是用java可以很方便用隊(duì)列或同步鎖解決,但是node并不適用以上場(chǎng)景,redis也只能解決搶購(gòu),誰(shuí)有還有合適的方案 ,期待中~回答4:

事務(wù) + 條件更新 從設(shè)計(jì)上避免了超賣。

相關(guān)文章: