当前位置:   article > 正文

余额mysql并发_如何进行余额更新,并发扣款,数据一致性问题

flask+mysql 如何处理经典银行并发扣款

导读

余额操作在大多数系统都是不可缺少和不允许出现问题的 如何修改余额 , 这个问题可能在实际项目中 没那么简单;

如何修改余额

假设一个用户数据 :

id⇒12 | user_name⇒放放 | fee⇒ 30 | updated_at ⇒ 2019-09-06 15:51:33

修改余额

//消费金额

$spend = 10;

//查询用户余额

$user = select id,fee from `users` where id = 12;

//计算金额

$newFee = $user['fee']-$spend;

//.. 这里检查余额是否足够

//更新余额

update `users` set fee = $newFee where id = 12 ;

按照正常逻辑来说上面更新余额是没问题的

但是如果发生并发 当 A 跟 B 同时发起请求时

请求A 查询出余额为 30

请求B 查询出余额为 30

请求B 更新余额为20

请求A 更新余额为20

最终用户余额为 20

也就是说 用户余额为30 两个请求都消费了 10元 即 30 - 10 -10 =10 但是当发生并发请求时 余额最终为20 这里的金额是错误的

在请求B 修改了 余额之后 请求A的查询出来的余额已经不是正确的了 导致了 余额更新错误

常见的解决办法 添加数据库的行锁

当请求A 执行时 先加入锁 阻塞 请求B直到 请求A完成之后 请求B 才继续执行

当然使用事务 并不是那么明智

//开始事务

begin;

//消

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/404529
推荐阅读
相关标签
  

闽ICP备14008679号