(https://cnodejs.org/topic/53e4984371470ac05511fa87#5608d7e9148959375f34ff73)
var index = parseInt(Math.random() * 4);var events= require('events');var x = new events.EventEmitter();var jpCount = 5; //conn.query(“select * from giftinfo” , function(row){ })x.on('lingjiang',lingjiangHandle);function lingjiang(user) { if (jpCount > 0){ x.emit('lingjiang', user); } else { console.log('獎(jiǎng)品已領(lǐng)玩'); }}lingjiangHandle = function(user) { jpCount --; if (lingjiangSucceed) { console.log(user + '領(lǐng)獎(jiǎng)成功'); } else { console.log(user + '領(lǐng)獎(jiǎng)失敗'); jpCount++; }}
這么做是不正確的。
很明顯一死,你對(duì)數(shù)據(jù)庫(kù)做了寫(xiě)操作,單單查詢來(lái)判斷是不夠的。必須修改數(shù)據(jù)庫(kù)成功,才能為用戶頒發(fā)獎(jiǎng)品障癌,如果失敗蚌卤,則意味獎(jiǎng)品不存在。
還有一種就是同步緩存卵惦,在nodejs服務(wù)器記錄一個(gè)獎(jiǎng)品數(shù)作為查詢和遞減,數(shù)據(jù)庫(kù)服務(wù)器只負(fù)責(zé)修改瓦戚。但是nodejs服務(wù)器掛掉會(huì)導(dǎo)致這個(gè)緩存消失沮尿,每次重新啟動(dòng)nodejs服務(wù)器,需要先去數(shù)據(jù)庫(kù)服務(wù)器確認(rèn)當(dāng)前可以領(lǐng)的獎(jiǎng)品數(shù)较解。
mongodb是存在寫(xiě)鎖的畜疾。
我的解決方法, 查詢后, 直接更新數(shù)據(jù)庫(kù)狀態(tài), 然后發(fā)放獎(jiǎng)勵(lì).