上一篇:人长得是漂亮,但论文是抄的:她的硕士、博士学位或将全被撤回!

在商品购买的过程中,库存的抵扣过程,一般操作如下:

1、select根据商品id查询商品的库存。

2、根据下单的数量,计算库存是否足够,如果存库不足则抛出库存不足的异常,如果库存足够,则减去扣除的库存得到最新的库存剩余值。

3、set设置最新的库存剩余值。

上述过程的伪代码如下:

// 根据商品id获取商品剩余库存
select stock_remaing from stock_table where id=${goodsId};// 操作库存
// 比较库存
if(stock_remaing <quantity){// 抛出库存不足的异常
}
else{// 抵扣以后的库存值int new_stock=stock_remaing - quantity;
}// 根据商品id设置计算后的库存
update stock_table  set stock_remaing =${new_stock} id=${goodsId};

并发修改数据库存超卖

如果数据库事务的隔离级别不是串行化(serializable),根据事务的特性,在并发修改的时候,可能会出现写覆盖的问题。

假设,商品的剩余库存stock_remaing 为100,客户A下单20,客户B下单30,在并发扣库存的时候,可能存在超卖。如果客户A和客户B同时获取剩余库存为100,则会出现事务后提交的值会覆盖前一个客户提交的值,有可能剩余的库存是80或者70。

流程如下:

加锁更新存库

为了在事务控制中,防止写覆盖,你会想到使用select for update的方式,将该商品的库存锁住,然后执行余下的操作。

流程如下:

以上,使用悲观锁方式,在分布式服务中,如果并发情况比较高的时候,扣减库存的操作是串行操作,效率很低。

使用乐观锁的方式更新

在更新的时候,使用(CAS+版本号更新)+重试条件(重试次数或者重试时间限制)乐观锁的方式更新库存。此时,如果,客户A和客户B同时读取到库存剩余100,在更新的时候,有一个操作会失败。

流程如下:

该种方式可以大大提高并发性,也可以保证数据的一致性;通过重试次数和重试时间的条件控制,可以防止过多的重试带来的数据库压力。

可以使用直接递减的方式执行么?

在抵扣库存的时候,有的人提议不执行select,计算,set三段式的操作,直接扣减的方式,并且对于扣减到小于零的情况作了判断。伪代码如下:

update stock_table set remaing_stock=remaing_stock-${quantity}
where id =商品id
and remaing_stock>${quantity};

在分布式服务调用中,因为网络异常,获取服务器异常,可能在微服务调用时,存在服务重试。例如,场景的网关超时,服务重试机制。此时,该种方式不满足幂等性,而存在多扣的情况。例如,同一用户扣减库存时,服务重试,极端情况下,该用户扣减库存操作执行多次,则就出现了商品超卖。

可以使用redis进行库存的抵扣么?

由于没有研究过redis源码,对于这种方式参考了大牛的回复,答案是可以使用redis的事务性扣减余额,但在CAS机制上比mysql没有优势,高性能是因为其内存存储的原因,带来的副作用是数据有丢失风险。

原文链接:https://blog.csdn.net/new_com/article/details/105568124

感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!小编到你上高速。

· END ·

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.心态崩了!税前2万4,到手1万4,年终奖扣税方式1月1日起施行~

2.深圳一普通中学老师工资单曝光,秒杀程序员,网友:敢问是哪个学校毕业的?

3.从零开始搭建创业公司后台技术栈

4.程序员一般可以从什么平台接私活?

5.清华大学:2021 元宇宙研究报告!

6.为什么国内 996 干不过国外的 955呢?

7.这封“领导痛批95后下属”的邮件,句句扎心!

8.15张图看懂瞎忙和高效的区别!

商品库存的扣除过程,如何防止超卖?相关推荐

  1. 【253期】京东二面:商品库存的扣除过程中,如何防止超卖问题?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 在商品购买 ...

  2. Redis作为单线程 为什么我用它还是出现了超卖的情况?

    实战说明 最近在一个项目营销活动中,一位同事用到了Redis来实现商品的库存管理.在压测的过程中,发现存在超卖的情况.这里总结一篇如何正确使用Redis来解决秒杀场景下,超卖的情况. 演示步骤 这里不 ...

  3. Redis 事务机制实现过程及原理,以及使用事务机制防止库存超卖

    一.Redis 事务实现的过程和原理 第一步:观察数据 客户端在修改数据之前,先使用watch命令观察要修改的数据,这一步相当于记下了数据的版本号 第二步:开启事务 使用 multi 命令开启事务. ...

  4. mysql 高并发扣除库存_【并发】mysql处理高并发,防止库存超卖

    先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购.秒杀.特价之类的活动,而这样的活动有一个共同的特点就是访问量激增.上千甚至上万人抢购 一个商品.然而,作为活动商品,库存肯定是很有限的,如何 ...

  5. 基于秒杀系统解决超卖、限流、Redis限时抢购等问题

    完整项目请见:https://gitee.com/JiaBin1 一.什么是秒杀 秒杀最直观的定义:在高并发场景下而下单某一个商品,这个过程就叫秒杀 [秒杀场景] 火车票抢票 双十一限购商品 热度高的 ...

  6. 聊聊电商系统中常见的9大坑,库存超卖、重复下单、物流单ABA...

    做为一名程序员,发展方向大致可以分为两个方面:一个是业务架构,一个是技术架构(中间件方向). 业务架构,取其核心关键词,主要是围绕这不同的业务场景.业务规则,完成业务系统的落地建设,为用户提供在线化的 ...

  7. Redis解决商品秒杀与超卖

    这个是实体店我们会看到的场景,100件商品,1人1件,最后200人中只有100人能买到商品,剩下100人只能空手而归.如果您开了家网店,同样你开起了秒杀的活动,可能同时会有1000人通过不同的终端访问 ...

  8. Java实现库存防超卖_高并发场景-订单库存防止超卖

    背景 在电商系统中买商品过程,先加入购物车,然后选中商品,点击结算,即会进入待支付状态,后续支付. 过程需要检验库存是否足够,保证库存不被超卖. 场景一:买家需要购买数量可以多件 场景二:秒杀活动,到 ...

  9. 阿里面试官:高并发大流量秒杀系统如何正确的解决库存超卖问题?(建议收藏)

    大家好,我是冰河~~ 在[精通高并发系列]的<实践出真知:全网最强秒杀系统架构解密!!>一文中,冰河详细的阐述了高并发秒杀系统的架构设计,也简单提到了如何扣减商品的库存. 也许不少小伙伴会 ...

  10. 秒杀超卖 解决方案(史上最全)

    文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...

最新文章

  1. 编程之基础:数据类型(二)
  2. 人类基因组最后一块拼图完成!Science罕见6篇连发
  3. 带图片的,多列的DropDownList的实现
  4. 交换机定时自动备份配置文件的方法
  5. springboot内置tomcat,会和Oracle端口冲突,所以需要配置新的端口号
  6. Kafka与ActiveMQ的区别与联系详解
  7. Python字符串format_map()
  8. python自动化面试提问_Python自动化测试笔试面试题精选
  9. [Hive]-Table
  10. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序
  11. 海康威视视频监控客户端开发实践
  12. SNDA校园招聘,参加哈尔滨和西安的面试
  13. 学习后台第二周(ง •_•)ง
  14. 航空货代系统之国际公务制单
  15. Android中实现平铺图片
  16. 管理信息化涉及的领域
  17. Ubuntu11.10 如何安装QQ?
  18. 【PHP】如何将表单数据上传至数据库
  19. Unity绳子/绳索效果
  20. 区块链行业分析:中国区块链企业总数已经超过10万家

热门文章

  1. 专业五线谱作曲打谱软件Overture的常用快捷键功能大全
  2. 《C#并发编程经典实例》学习笔记—2.1 暂停一段时间
  3. iptables/arptables实现单IP一级二级路由
  4. quartz配置参数说明
  5. SaaS行业乘风杨帆,中小企业市场潜力分析
  6. React.js 组件的 props vs state
  7. 实现自己的控制层do-c (仿Struts2和SpringMVC)(六)
  8. 苹果Mac鼠标光标丢失如何找回?
  9. Wondershare Recoverit for Mac(数据恢复软件)
  10. 苹果Mac Finder 替代工具:Path Finder