解决 抽奖活动 被快速访问 刷奖品的问题

一般情况下,我们是这样做的

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的才能发放礼品。是不是很赞!

此处评论已关闭