mysql数据库并发修改时出现的数据错误

问题现象
H5 游戏 ,线上用户报bug说账户余额信息与交易流水对不上。可以认为是数据库并发更新问题,由此定位出具体原因,并给出解决方案。

场景描述
后台给用户充值或提现时,且高并发量的情况下,出现充值100元(假设当前用户余额为50元)与此同时用户又下注10元,此时用于产生两条帐变信息,结果应该是
1变动金额 10 变动后余额 40 内容“下注”
2变动金额100 变动后余额 140 内容“充值”
或者
1变动金额100 变动后余额 150 内容“充值”
2变动金额 10 变动后余额 140 内容“下注”
但是
账变信息表表现为
1变动金额100 变动后余额 150 内容“充值”
2变动金额 10 变动后余额 40 内容“下注” 此处应该为 变动后余额140
导致用户变动后余额错误。
环境说明
mysql5.6 + innodb + php5.6
场景模拟
具体操作为
select money from user where id=x;
update usercoinlog set bdmoney = 刚刚查到的余额+变动金额 WHERE userid=x;

问题出现了
原因定位
假如后台充值和用户下注同时进行,同时查到的余额为50,再做update更新时把50拿来作为参照记录就会出现上述错误!

解决方案
方案一
增加数据库锁,不过这个玩意儿有一定弊端,后续再做介绍

方案二
在查询的时候取出来一个 字段值,比如叫 更新次数,在更新的时候我 update 表 set Money=Money-50, 更新次数=更新次数+1 where u

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值