请教一个问题,redis 锁相关的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CantSee
V2EX    问与答

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

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

    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     Solana     2707 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 15:15 PVG 23:15 LAX 08:15 JFK 11:15
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86