利用MySQL的锁解决并发问题

在MySQL中,假设有一种账户表,有一个账户金额字段,每当有响应操作时需要更新账户金额,那么这个时候就需要考虑并发问题,比如账户原有金额100元,现在有100个人同时给这个账户转账,此时数据库就会有多个线程来操作账户金额字段,我们能不能直接利用MySQL的能力完成并发操作?

答案是肯定的,解决的SQL就是:

update user_account set amount = amount + x where user_id = 1;

这句SQL就能保证并发,这是数据库系统必须要解决的问题。在对数据进行写操作时,需要对相应数据加上排他锁,即时使用了MVCC,也只能让读写并发,写和写之间一定是会串行的,这是数据库保证的。所以上面的SQL是可以放心的在并发环境下执行并能够得出正确结果。

第二种情况

但是这种情况仅仅适用于修改字段目标值比较简单的情况,可以在SQL中完成运算,如果有场景是必须先查出来目标值,然后经过复杂计算(比如调用其他服务计算),最后写入,这种情况就无法直接通过一条SQL解决。

通常这种情况,如果想使用乐观锁的思想,需要在表里面新增一个整型的version字段,修改前查出目标值和version=v1,然后经过计算,写入时

update user_account set amount=x,version=version+1 where version=v1 and user_id=u

这样就可以利用乐观锁的思想了。

这里还有一个不成熟的思想,就是目标值本身来作为version。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值