解决 抽奖活动 被快速访问 刷奖品的问题
一般情况下,我们是这样做的
1.首先判断该用户领取礼品的 标识字段 是否为1(也可以是其他,这里只是假定1就是:已领取)
2.如果是1,则已经领取
3.如果是0,则没有领取,可以发放礼品,并将这个标识字段修改成1
但是存在以下bug
如果我疯狂访问,高速同一帐号抽奖,在0变为1的这段时间内,程序读取到的都是0,那么这段时间内的访问都会中奖
使用以下方法优化
建表
[pcsh lang="sql" tab_size="4" message="" hl_lines="" provider="manual"]
CREATE TABLE `gift_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`flag` tinyint(2) DEFAULT NULL,
`uid` int(11) DEFAULT NULL,
`date_time` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
[/pcsh]
我这里模拟了一条数据,仅仅是为了更形象的让大家理解
[pcsh lang="php" tab_size="4" message="" hl_lines="" provider="manual"]
id flag uid date_time
1 0 1 20160407
[/pcsh]
1.首先判断
[pcsh lang="sql" tab_size="4" message="" hl_lines="" provider="manual"]
select flag from gift_log where uid = 1
[/pcsh]
2.没有发放礼品就再更新
[pcsh lang="sql" tab_size="4" message="" hl_lines="" provider="manual"]
update gift_log set flag = 1 where flag = 0
[/pcsh]
3.判断影响的行数
如果影响行数为1,表示是从0=>1的过程,如果影响行数是0,表示是从1=>1的过程,只有影响行数是1的才能发放礼品。是不是很赞!
最后更新于 2017-03-17 15:58:08 并被添加「」标签,已有 621 位童鞋阅读过。
此处评论已关闭