(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('奖品已领玩'); }}lingjiangHandle = function(user) { jpCount --; if (lingjiangSucceed) { console.log(user + '领奖成功'); } else { console.log(user + '领奖失败'); jpCount++; }}
这么做是不正确的。
很明显,你对数据库做了写操作,单单查询来判断是不够的。必须修改数据库成功,才能为用户颁发奖品,如果失败,则意味奖品不存在。
还有一种就是同步缓存,在nodejs服务器记录一个奖品数作为查询和递减,数据库服务器只负责修改。但是nodejs服务器挂掉会导致这个缓存消失,每次重新启动nodejs服务器,需要先去数据库服务器确认当前可以领的奖品数。
mongodb是存在写锁的。
我的解决方法, 查询后, 直接更新数据库状态, 然后发放奖励.