我写的伪代码如下,但出现了个bug,抽奖现在要限制每日抽奖结果出现的次数,但实际运行是在并发时不能限制住,如何解决?resultDayLimitTimes={resultA=>2#每天最多出现2次resultB=>5#每天最多出现5次resultC=>20#每天最多出现20次resultD=>Infinite#每天出现次数没有限制}Begintransactionselect*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>todayDateifyyCountbreak }}updatelottery_chancesetresult=YY,used_time=nowwhereid=XXCommit
ibeautiful
相关分类