并发时库存超卖时问题解决方案

北城以北 提交于 2019-11-27 14:20:32

并发时库存超卖时问题解决

方案一

  • 数据库设置字段为无符号型
  • 当并发超卖时直接报异常
  • 通过捕获异常提示已经售空。

方案二

  • 采用排他锁
  • 当用户同时到达更新操作,同时到达的用户一个个执行
  • 在当前这个update语句commit之前,其他用户等待执行

方案三

  • 采用Redis的队列实现,用于抢购
  • 先从MySQL读取库存数,放到Redis的队列中
  • 用户直接操作队列,当队列为空时提醒售空
  • 当抢购结束后可执行更新库存表操作

方案四

  • 采用乐观锁原理
  • 在数据表中加入版本号字段
  • 当读取数据时,将version字段的值一同读出,数据每更新一次,对当前version值加一,当并发数据进行出库操作时新version版本号不同而停止
  • 这样虽然不能避免脏读,但是能避免脏读后对数据产生的影响,对比悲观锁需要一直锁数据来说性能提升很大。

关于MVCC(Multiversion Concurrency Control多版本并发控制)

  • innoDB的行级锁采用了乐观锁原理,在每个字段后面隐藏了两个字段,分别是创建版本号与删除版本号,当创建时记录创建时间,当记录删除或者更新时记录删除时间,因为创建时间和删除时间都是根据索引来的,所以innodb锁索引。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!