高并发下余额扣减一致性问题
业务场景,在购买商品时需要对余额进行查询与修改:
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队列)