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

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

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. 两种底层数据层操作时的架构方式,你喜欢那种?
  3. Java复习-线程之间的通信与同步
  4. IT公司100题-4-在二元树中找出和为某一值的所有路径
  5. STORM_0001_用vmware拷贝出三个相同的ubuntu搭建小的zookeeper集群
  6. 【Java 虚拟机原理】Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )
  7. 指定rviz的点启动_好消息!武汉已经启动新冠疫苗紧急接种工作
  8. 国内 GitHub 造假黑色产业链曝光;开源开发者撤销对 ICE 禁用的决定
  9. 前端学习(615):变量
  10. 【python教程入门学习】Python 正则表达式
  11. python和nodejs数据传递_python中的*和**参数传递机制
  12. 集群起不来oracle,Oracle11g rac 集群无法启动分析及处理
  13. 系统学习深度学习(二十二)--CNN经典模型总结
  14. 用条件注释判断浏览器版本,解决兼容问题
  15. 51单片机程序执行流程详细分析
  16. 基于动态优先级的时间片轮转调度算法c语言
  17. 二十一世纪大学英语读写教程学习笔记(原文)——3 - Stevie Wonder: Sunshine in the Shadow(Stevie Wonder——黑暗中的阳光)
  18. 海龟编程计算机,第一个海龟程序
  19. Tomcat:The server encountered an internal error () that prevented it from fulfilling this request.
  20. 2020大疆数字IC校招笔试题(3)——CMOS 反相器【CMOS逻辑】【MOS管】【PMOS】【NMOS】

热门文章

  1. Xcode 真机运行报错Errors were encountered while preparing your device for development. Please check the De
  2. iOS 不同数据类型存入可变数组
  3. 如何用iMazing备份和恢复辐射避难所
  4. matlab练习程序(Prim最小生成树)
  5. 光声光谱技术和激光、红外技术的优劣势对比
  6. (十一)JAVA springboot ssm b2b2c多用户商城系统 - SSO单点登录之OAuth2.0登录流程(2)
  7. SylixOS中netdev_pbuf_alloc函数分析
  8. 《千与千寻》给读者带来了什么?
  9. 21个最佳jQuery插件推荐
  10. hdu 4339 Query 线段树 多校联合赛(四) 第九题