做了个大转盘抽奖,发现有用户在一个时间中了两个奖,如何避免呢?

做了一个大转盘抽奖,输入手机号码进行抽奖。前提时手机号码只能中一次,中过以后任意抽都只是谢谢参与。查数据发现有一个手机号码中了两次奖,按理是不允许的。
去查询日志发现,中奖者用了两个IP进行抽,也就是用了两台手机在同一时间进行抽奖,而且还中了,中的金额还不一样。
我的后台逻辑是
1、输入手机号,在数据库查询是否有中奖记录,如果有就提示谢谢参与。
2、如果没有记录,就通过概率来算,是否中奖,中奖就写入表。
3、现在是两条记录同时中奖,写入数据库里的时间是一样 的。这个怎么处理呢?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

创建数据库的时候对phone字段 设置unique,你就不能插入两条手机号码一样的数据。

3年前 评论

创建数据库的时候对phone字段 设置unique,你就不能插入两条手机号码一样的数据。

3年前 评论
KayuHo

这说明别人是通过脚本并发请求的,你查库的时候请求已经绕过了,可以考虑加锁

3年前 评论

我之前做的项目 从数据库查询 判断否存在用户名,存在则不能创建。

估计是个单身中年人 点击速度很快, 幸亏我加了unique,不然事情会变得非常麻烦。

3年前 评论

unique 因为允许一个手机号抽奖多次的,锁定了就只能一次呗。 如果是中奖了就不能在写入那个了。

3年前 评论

可以试着使用 Redis 解决这个并发场景, 在请求最开头就存入一个 key 并在存之前验证是否存在, 存在就不允许往下面走了, 然后再去验证 DB 里面是, 请求结束时删除掉这个 key。因为 Redis 一个操作就是原子性的,应该大概率应该不会出现这种并发问题了

3年前 评论
lochpure

单一设备登陆

3年前 评论

并发锁,这个很正常,不光是抽奖,各种业务场景都有可能

3年前 评论

简单的 表加唯一键。 高级的 上分布式锁

3年前 评论

数据库加唯一索引,判断逻辑加锁

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!