V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
chuanqirenwu
V2EX  ›  问与答

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

  •  
  •   chuanqirenwu · Feb 23, 2022 · 2385 views
    This topic created in 1532 days ago, the information mentioned may be changed or developed.

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

    11 replies    2022-02-25 21:06:19 +08:00
    CEBBCAT
        1
    CEBBCAT  
       Feb 23, 2022
    查一下电商平台怎么给用户扣款吧。一般来说可以去设计一个对于 entry 的锁,在这里是一个邀请码,只允许获取到邀请码锁的用户核销这个邀请码
    pupboss
        2
    pupboss  
       Feb 23, 2022   ❤️ 1
    看你们容忍程度吧,redis 里面的 GETDEL 可以满足大部分场景

    https://redis.io/commands/getdel
    Rocketer
        3
    Rocketer  
       Feb 23, 2022 via iPhone
    这不就是线程安全问题么?读的时候可以不管,改的时候先锁后改,第二个来的就会失败了。
    netnr
        4
    netnr  
       Feb 24, 2022 via Android
    最简单就是数据库唯一约束
    dingwen07
        5
    dingwen07  
       Feb 24, 2022
    加个字段存邀请码,然后 UNIQUE ?或者定期扫一遍新注册用户发现重复就停用?
    JKeita
        6
    JKeita  
       Feb 24, 2022
    update t1 set is_used=1 where is_use=0 and id=xxx; 修改成功就可以了。
    xwayway
        7
    xwayway  
       Feb 24, 2022
    这这这,,,就是一个并发问题啊,而且和库存的并发还不一样,简单的行锁,乐观锁就实现了。
    SjwNo1
        8
    SjwNo1  
       Feb 24, 2022
    上锁即可
    leavic
        9
    leavic  
       Feb 24, 2022
    这不就是最基本的不要让多个进程同时访问一个 IO 的问题吗,上锁啊。
    leon0318
        10
    leon0318  
       Feb 24, 2022 via iPhone
    这不是经典的锁场景吗
    yungo8
        11
    yungo8  
       Feb 25, 2022 via Android
    7 楼最简单,先 select 到邀请码的 id ,然后转化成并发情况下对同一个邀请码更改状态,谁先 update 返回 1 成功就可以注册成功。也不用代码层面去加锁 select 来判断有没有被使用
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5873 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 56ms · UTC 02:00 · PVG 10:00 · LAX 19:00 · JFK 22:00
    ♥ Do have faith in what you're doing.