V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
CantSee
V2EX  ›  问与答

请教一个问题,redis 锁相关的

  •  
  •   CantSee · 2020-06-19 09:24:38 +08:00 · 1865 次点击
    这是一个创建于 1645 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1.一个平台中有若干个商户,商户在平台上各自有一个虚拟账户;平台也有虚拟账户,专门给商户汇款,只是做数据库加减的操作,这个钱可提现; 2.查到所有的商户后,进行打款的操作,这个锁是加到循环中还是循环外面呢,锁默认时间是 30S; 3.可能会有其他的接口会查询到这个账户余额之类的;

    11 条回复    2020-06-19 21:10:40 +08:00
    xjmroot
        1
    xjmroot  
       2020-06-19 09:51:34 +08:00
    你这说的应该是里面,向这样
    for(...所有商户...){
    write_lock(付款方,收款方)
    付款方 -¥
    收款方 +¥
    write_unlock(付款方,收款方)
    }
    damai0419
        2
    damai0419  
       2020-06-19 09:56:12 +08:00
    3 对问题没影响吧。查询也不需要锁。
    Vegetable
        3
    Vegetable  
       2020-06-19 09:59:42 +08:00
    差别不那么大,加到内部就行,你每次的操作只涉及到两个账户,其他账户没必要同时锁住
    CantSee
        4
    CantSee  
    OP
       2020-06-19 11:35:42 +08:00
    @xjmroot 对是这样的,我现在是这样做的,但是感觉频繁的加锁和解锁不是很好,想寻求其他的解决方案
    rahuahua
        5
    rahuahua  
       2020-06-19 11:53:22 +08:00
    关于钱这种东西,居然这么豪放,不用 RDBMS,用 redis 锁
    dengkj
        6
    dengkj  
       2020-06-19 13:35:46 +08:00
    应该加到循环里,另外应该用数据库锁,不应该用 Redis 锁,这样可靠性更高
    wqhui
        7
    wqhui  
       2020-06-19 14:20:36 +08:00
    @damai0419 查询如果想要保证是最新的数据还是要拿锁的,不然可能会出现读的时候正在进行修改余额的流程但还未写入库,然后读到的是旧数据
    CantSee
        8
    CantSee  
    OP
       2020-06-19 14:26:27 +08:00
    @Vegetable 再加上数据库的悲观锁
    wqhui
        9
    wqhui  
       2020-06-19 14:30:09 +08:00
    @CantSee 你是想着在循环外锁,一批账户一块锁了,只加解锁一次?但锁了以后这一批账号这段时间内都没法操作了。只有在没业务的时间段比如凌晨什么的才可以这么干,如果这操作随时进行,而且执行时间过长,能被感觉到,你想想会不会被投诉
    damai0419
        10
    damai0419  
       2020-06-19 14:38:56 +08:00
    @wqhui 不太明白呀,既然数据未入库,就应该查不到呀。如果事务失败回滚了,但却查到的是未入库的数据,不就有问题了嘛?
    wqhui
        11
    wqhui  
       2020-06-19 21:10:40 +08:00
    @damai0419 我的意思是数据库内这个账号原来就有数据了,然后在进行着更新这个账号数据的操作,但还未提交,这时查询不检测锁直接查,得到的就是旧数据了,类似于数据库不可重复读。在它这个业务中就有可能出现,我原本账户余额是 0,卖了东西账户余额应该增加到 10,这个增加的操作还未完成的时候我查询账户余额就会是 0,拿去做提现的时候,因为提现是需要拿锁就可以大概率可以保证拿到最新数据( redis 锁有种情况会导致多个事务都拿到了同一个锁),就会出现查询的跟提现不一致的情况
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5010 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:34 · PVG 17:34 · LAX 01:34 · JFK 04:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.