商品库存的扣除过程,如何防止超卖?
上一篇:人长得是漂亮,但论文是抄的:她的硕士、博士学位或将全被撤回!
在商品购买的过程中,库存的抵扣过程,一般操作如下:
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张图看懂瞎忙和高效的区别!
商品库存的扣除过程,如何防止超卖?相关推荐
- 【253期】京东二面:商品库存的扣除过程中,如何防止超卖问题?
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 在商品购买 ...
- Redis作为单线程 为什么我用它还是出现了超卖的情况?
实战说明 最近在一个项目营销活动中,一位同事用到了Redis来实现商品的库存管理.在压测的过程中,发现存在超卖的情况.这里总结一篇如何正确使用Redis来解决秒杀场景下,超卖的情况. 演示步骤 这里不 ...
- Redis 事务机制实现过程及原理,以及使用事务机制防止库存超卖
一.Redis 事务实现的过程和原理 第一步:观察数据 客户端在修改数据之前,先使用watch命令观察要修改的数据,这一步相当于记下了数据的版本号 第二步:开启事务 使用 multi 命令开启事务. ...
- mysql 高并发扣除库存_【并发】mysql处理高并发,防止库存超卖
先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购.秒杀.特价之类的活动,而这样的活动有一个共同的特点就是访问量激增.上千甚至上万人抢购 一个商品.然而,作为活动商品,库存肯定是很有限的,如何 ...
- 基于秒杀系统解决超卖、限流、Redis限时抢购等问题
完整项目请见:https://gitee.com/JiaBin1 一.什么是秒杀 秒杀最直观的定义:在高并发场景下而下单某一个商品,这个过程就叫秒杀 [秒杀场景] 火车票抢票 双十一限购商品 热度高的 ...
- 聊聊电商系统中常见的9大坑,库存超卖、重复下单、物流单ABA...
做为一名程序员,发展方向大致可以分为两个方面:一个是业务架构,一个是技术架构(中间件方向). 业务架构,取其核心关键词,主要是围绕这不同的业务场景.业务规则,完成业务系统的落地建设,为用户提供在线化的 ...
- Redis解决商品秒杀与超卖
这个是实体店我们会看到的场景,100件商品,1人1件,最后200人中只有100人能买到商品,剩下100人只能空手而归.如果您开了家网店,同样你开起了秒杀的活动,可能同时会有1000人通过不同的终端访问 ...
- Java实现库存防超卖_高并发场景-订单库存防止超卖
背景 在电商系统中买商品过程,先加入购物车,然后选中商品,点击结算,即会进入待支付状态,后续支付. 过程需要检验库存是否足够,保证库存不被超卖. 场景一:买家需要购买数量可以多件 场景二:秒杀活动,到 ...
- 阿里面试官:高并发大流量秒杀系统如何正确的解决库存超卖问题?(建议收藏)
大家好,我是冰河~~ 在[精通高并发系列]的<实践出真知:全网最强秒杀系统架构解密!!>一文中,冰河详细的阐述了高并发秒杀系统的架构设计,也简单提到了如何扣减商品的库存. 也许不少小伙伴会 ...
- 秒杀超卖 解决方案(史上最全)
文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...
最新文章
- 受精卵或非“生命起始”?网友:教材是不是要改了……
- 两种底层数据层操作时的架构方式,你喜欢那种?
- Java复习-线程之间的通信与同步
- IT公司100题-4-在二元树中找出和为某一值的所有路径
- STORM_0001_用vmware拷贝出三个相同的ubuntu搭建小的zookeeper集群
- 【Java 虚拟机原理】Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )
- 指定rviz的点启动_好消息!武汉已经启动新冠疫苗紧急接种工作
- 国内 GitHub 造假黑色产业链曝光;开源开发者撤销对 ICE 禁用的决定
- 前端学习(615):变量
- 【python教程入门学习】Python 正则表达式
- python和nodejs数据传递_python中的*和**参数传递机制
- 集群起不来oracle,Oracle11g rac 集群无法启动分析及处理
- 系统学习深度学习(二十二)--CNN经典模型总结
- 用条件注释判断浏览器版本,解决兼容问题
- 51单片机程序执行流程详细分析
- 基于动态优先级的时间片轮转调度算法c语言
- 二十一世纪大学英语读写教程学习笔记(原文)——3 - Stevie Wonder: Sunshine in the Shadow(Stevie Wonder——黑暗中的阳光)
- 海龟编程计算机,第一个海龟程序
- Tomcat:The server encountered an internal error () that prevented it from fulfilling this request.
- 2020大疆数字IC校招笔试题(3)——CMOS 反相器【CMOS逻辑】【MOS管】【PMOS】【NMOS】
热门文章
- Xcode 真机运行报错Errors were encountered while preparing your device for development. Please check the De
- iOS 不同数据类型存入可变数组
- 如何用iMazing备份和恢复辐射避难所
- matlab练习程序(Prim最小生成树)
- 光声光谱技术和激光、红外技术的优劣势对比
- (十一)JAVA springboot ssm b2b2c多用户商城系统 - SSO单点登录之OAuth2.0登录流程(2)
- SylixOS中netdev_pbuf_alloc函数分析
- 《千与千寻》给读者带来了什么?
- 21个最佳jQuery插件推荐
- hdu 4339 Query 线段树 多校联合赛(四) 第九题