1.一个平台中有若干个商户,商户在平台上各自有一个虚拟账户;平台也有虚拟账户,专门给商户汇款,只是做数据库加减的操作,这个钱可提现; 2.查到所有的商户后,进行打款的操作,这个锁是加到循环中还是循环外面呢,锁默认时间是 30S; 3.可能会有其他的接口会查询到这个账户余额之类的;
1
xjmroot 2020-06-19 09:51:34 +08:00
你这说的应该是里面,向这样
for(...所有商户...){ write_lock(付款方,收款方) 付款方 -¥ 收款方 +¥ write_unlock(付款方,收款方) } |
2
damai0419 2020-06-19 09:56:12 +08:00
3 对问题没影响吧。查询也不需要锁。
|
3
Vegetable 2020-06-19 09:59:42 +08:00
差别不那么大,加到内部就行,你每次的操作只涉及到两个账户,其他账户没必要同时锁住
|
5
rahuahua 2020-06-19 11:53:22 +08:00
关于钱这种东西,居然这么豪放,不用 RDBMS,用 redis 锁
|
6
dengkj 2020-06-19 13:35:46 +08:00
应该加到循环里,另外应该用数据库锁,不应该用 Redis 锁,这样可靠性更高
|
7
wqhui 2020-06-19 14:20:36 +08:00
@damai0419 查询如果想要保证是最新的数据还是要拿锁的,不然可能会出现读的时候正在进行修改余额的流程但还未写入库,然后读到的是旧数据
|
9
wqhui 2020-06-19 14:30:09 +08:00
@CantSee 你是想着在循环外锁,一批账户一块锁了,只加解锁一次?但锁了以后这一批账号这段时间内都没法操作了。只有在没业务的时间段比如凌晨什么的才可以这么干,如果这操作随时进行,而且执行时间过长,能被感觉到,你想想会不会被投诉
|