并发时库存超卖时问题解决
方案一
- 数据库设置字段为无符号型
- 当并发超卖时直接报异常
- 通过捕获异常提示已经售空。
方案二
- 采用排他锁
- 当用户同时到达更新操作,同时到达的用户一个个执行
- 在当前这个update语句commit之前,其他用户等待执行
方案三
- 采用Redis的队列实现,用于抢购
- 先从MySQL读取库存数,放到Redis的队列中
- 用户直接操作队列,当队列为空时提醒售空
- 当抢购结束后可执行更新库存表操作
方案四
- 采用乐观锁原理
- 在数据表中加入版本号字段
- 当读取数据时,将version字段的值一同读出,数据每更新一次,对当前version值加一,当并发数据进行出库操作时新version版本号不同而停止
- 这样虽然不能避免脏读,但是能避免脏读后对数据产生的影响,对比悲观锁需要一直锁数据来说性能提升很大。
关于MVCC(Multiversion Concurrency Control多版本并发控制)
- innoDB的行级锁采用了乐观锁原理,在每个字段后面隐藏了两个字段,分别是创建版本号与删除版本号,当创建时记录创建时间,当记录删除或者更新时记录删除时间,因为创建时间和删除时间都是根据索引来的,所以innodb锁索引。
来源:CSDN
作者:陈豆粒
链接:https://blog.csdn.net/qq_28643817/article/details/88792135