2 个用户同时使用同一个邀请码注册,如何保证邀请码有效性校验的原子性?

2022 年 2 月 23 日
 chuanqirenwu

在做一个通过邀请码注册的功能,当用户使用某个邀请码注册后,这个邀请码就会失效。问题是,如果 2 个用户同时使用同一个邀请码注册,有几率 2 个邀请码都会被校验为有效的,一般采用什么方案避免这个问题呢?

2301 次点击
所在节点    问与答
11 条回复
CEBBCAT
2022 年 2 月 23 日
查一下电商平台怎么给用户扣款吧。一般来说可以去设计一个对于 entry 的锁,在这里是一个邀请码,只允许获取到邀请码锁的用户核销这个邀请码
pupboss
2022 年 2 月 23 日
看你们容忍程度吧,redis 里面的 GETDEL 可以满足大部分场景

https://redis.io/commands/getdel
Rocketer
2022 年 2 月 23 日
这不就是线程安全问题么?读的时候可以不管,改的时候先锁后改,第二个来的就会失败了。
netnr
2022 年 2 月 24 日
最简单就是数据库唯一约束
dingwen07
2022 年 2 月 24 日
加个字段存邀请码,然后 UNIQUE ?或者定期扫一遍新注册用户发现重复就停用?
JKeita
2022 年 2 月 24 日
update t1 set is_used=1 where is_use=0 and id=xxx; 修改成功就可以了。
xwayway
2022 年 2 月 24 日
这这这,,,就是一个并发问题啊,而且和库存的并发还不一样,简单的行锁,乐观锁就实现了。
SjwNo1
2022 年 2 月 24 日
上锁即可
leavic
2022 年 2 月 24 日
这不就是最基本的不要让多个进程同时访问一个 IO 的问题吗,上锁啊。
leon0318
2022 年 2 月 24 日
这不是经典的锁场景吗
yungo8
2022 年 2 月 25 日
7 楼最简单,先 select 到邀请码的 id ,然后转化成并发情况下对同一个邀请码更改状态,谁先 update 返回 1 成功就可以注册成功。也不用代码层面去加锁 select 来判断有没有被使用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/836030

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX