高并发下余额扣减一致性问题

2019-12-25 Stone 运维

业务场景,在购买商品时需要对余额进行查询与修改:

1、先从数据库查询余额:select balance from t_money where uid = $uid;

2、业务层:假如$balance= 100, 变动金额 $money = 80; 剩余金额 if($balance > $money) $new_balance = $balance - $money;

3、更新数据库 update t_money set balance = $new_balance where uid = $uid;


如果在高并发下,这种查询+修改就会出现问题:

同时触发两个业务:业务1和业务2,在查询的时候都是返回$balance = 100,

业务1操作金额 $money = 80,新余额:$new_balance = $balance - $money,也就是 100 - 80 = 20;

业务2操作金额 $money = 70,新余额:$new_balance = $balance - $money,也就是 100 -70 = 30; 

此时就会出现异常,更新数据后balance = 30。


暂时想到的解决方案:事务 + 缓存(redis队列)



参考文档:http://lichuanyang.top/posts/56940/

标签: 高并发 余额扣减

Copyright © 2019 by 海角孤星 京ICP备15056837号-1