如何设计高并发下的抽奖?

我写的伪代码如下,但出现了个bug,抽奖现在要限制每日抽奖结果出现的次数,但实际运行是在并发时不能限制住,如何解决?
resultDayLimitTimes={
resultA=>2#每天最多出现2次
resultB=>5#每天最多出现5次
resultC=>20#每天最多出现20次
resultD=>Infinite#每天出现次数没有限制
}
Begintransaction
select*fromlottery_chancewhereid=XXandresult=nulllimit1forupdate
#bug就在下面这个循环里,如果resultA今天已经出现过一次了,
#然后有2个人(这2人的XX是不同的,所以前面的forupdate对
#于这种并发不能限制,前面的forupdate是用来防止同一次抽奖机会被并发时使用多次的)
#同时抽到YY=resultA,由于事务还未提
#交那么yyCount都是1,小于每日限制2,于是跳出循环,这2人
#都中了resultA,这时当天出现了3个resultA超出2个限制,
#我应该怎么写才能解决这个问题?
whiletrue{
YY=randomIn[resultA,resultB,resultC,resultD]
yyCount=selectcount(*)fromlottery_chancewhereresult=YYandused_time>todayDate
ifyyCountbreak
}
}
updatelottery_chancesetresult=YY,used_time=nowwhereid=XX
Commit
胡子哥哥
浏览 333回答 2
2回答

ibeautiful

高并发下抽奖跟秒杀系统有些类似。比如,中奖只是少数,大部分人并不会中奖。所以可以在第一步便限制只有少数用户的请求能够打到真正抽奖逻辑上。这样一来服务器压力就小了很多。真正参与抽奖的用户,先随机下该用户能不能中奖,中什么奖,如果是中了,再去查询有没有该奖(若没有奖则显示未中)。这样,又减少了一些对数据库的请求。这样,高并发也只限于http服务器,对数据库的压力不是很大。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript