场景介绍
场景1:扣费,企业账户送流量或者红包,用户签到领取。此场景下就是多用户对某一个账号的并发扣款;
场景2:充值,打赏给主播,这种场景是多用户对同一个账号进行打款,但是方案和问题和场景1是一致的。
场景举例
假设有两个业务操作同一个账号,账号余额为,业务1扣除50,业务2扣除40,如果顺利应该是剩余-50-40=10,那么我们看如下并发操作的场景:
时间线
业务1
业务2
T1
从数据库中查询余额为
T2
从数据库中查询余额为
T3
计算消费金额后的余额例如50
T4
计算消费金额后的余额例如60
T5
更新数据库余额为50
T6
更新数据库余额为60
通过两个业务的并发操作,最后账户余额为60(是业务2最后修改后的余额值)。
解决方案
(1)分布式锁
由于是分布式环境,采用分布式锁可以保证数据一致性,但是这是小概率事件,并且引入新组件(redis/zk),还会降低吞吐量。
分布式锁参考: