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

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

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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年前 评论

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