做了个大转盘抽奖,发现有用户在一个时间中了两个奖,如何避免呢?
做了一个大转盘抽奖,输入手机号码进行抽奖。前提时手机号码只能中一次,中过以后任意抽都只是谢谢参与。查数据发现有一个手机号码中了两次奖,按理是不允许的。
去查询日志发现,中奖者用了两个IP进行抽,也就是用了两台手机在同一时间进行抽奖,而且还中了,中的金额还不一样。
我的后台逻辑是
1、输入手机号,在数据库查询是否有中奖记录,如果有就提示谢谢参与。
2、如果没有记录,就通过概率来算,是否中奖,中奖就写入表。
3、现在是两条记录同时中奖,写入数据库里的时间是一样 的。这个怎么处理呢?
关于 LearnKu
高认可度评论:
创建数据库的时候对
phone字段 设置unique,你就不能插入两条手机号码一样的数据。创建数据库的时候对
phone字段 设置unique,你就不能插入两条手机号码一样的数据。这说明别人是通过脚本并发请求的,你查库的时候请求已经绕过了,可以考虑加锁
我之前做的项目 从数据库查询 判断否存在用户名,存在则不能创建。
估计是个单身中年人 点击速度很快, 幸亏我加了
unique,不然事情会变得非常麻烦。unique 因为允许一个手机号抽奖多次的,锁定了就只能一次呗。 如果是中奖了就不能在写入那个了。
可以试着使用
Redis解决这个并发场景, 在请求最开头就存入一个key并在存之前验证是否存在, 存在就不允许往下面走了, 然后再去验证DB里面是, 请求结束时删除掉这个key。因为Redis一个操作就是原子性的,应该大概率应该不会出现这种并发问题了transaction+lockforupdate
单一设备登陆
并发锁,这个很正常,不光是抽奖,各种业务场景都有可能
简单的 表加唯一键。 高级的 上分布式锁
数据库加唯一索引,判断逻辑加锁