点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方有惊喜,留言必回,有问必答!

每一天进步一点点,是成功的开始...

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

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),根据事务的特性,在并发修改的时候,可能会出现写覆盖的问题。

推荐下自己做的 Spring boot 的实战项目:
https://gitee.com/yoodb/jing-xuan‍

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

加锁更新存库

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

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

使用乐观锁的方式更新

在更新的时候,使用(CAS+版本号更新)+重试条件(重试次数或者重试时间限制)乐观锁的方式更新库存(乐观锁的操作过程可以参考使用Spring AOP+注解基于CAS方式实现java的乐观锁)。

推荐下几个月熬夜整理的近 10000+ 面试资料大全:https://gitee.com/yoodb/eboo‍ks

此时,如果,客户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没有优势,高性能是因为其内存存储的原因,带来的副作用是数据有丢失风险。

版权声明:本文为CSDN博主「iloveoverfly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

https://blog.csdn.net/new_com/article/details/105568124

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

------ THE END ------

精品资料,超赞福利!

>Java精选面试题<
3000+ 道面试题在线刷,最新、最全 Java 面试题!

期往精选  点击标题可跳转

【245期】面试官:同类中两个方法加同步锁,多个线程支持同时访问这两个方法吗?

【246期】Git 常用命令,每条都很重要!

【247期】自从用了 OkHttp3,别的都完全不想用了!

【248期】如何在 Spring Boot 中使用异步方法优化 Service 逻辑提高接口响应速度?

【249期】Mybatis 源码解读 — 9 种设计模式,真是太有用了!

【250期】面试官问:谈一谈 MQ 消息幂等(去重)通用解决方案?

【251期】分享一款基于 SpringBoot 和 ElementUi 的 HC 小区物联网平台,附源码!

【252期】爆赞,对 volatile 关键字讲解最好的一篇文章!

 技术交流群!

最近有很多人问,有没有读者交流群!想知道如何加入?方式很简单,兴趣相投的朋友,只需要点击下方卡片,回复“加群”,即可无套路入交流群!

文章有帮助的话,在看,转发吧!

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

  1. 【2017年第3期】电信大数据在信用风险管理中的应用

    刘新海1,韩涵2,丁伟3,王题3 1. 中国人民银行征信中心,北京 100031 2. 中国信息通信研究院,北京 100191 3. 中国联合网络通信有限公司网络技术研究院,北京 100048 摘要: ...

  2. 第13期 《由量变到质变的过程》3月刊

    1.[linux系统安装Jenkins]--王婷婷 自荐理由:熟悉Jenkins,并且可以实际操作 推荐理由:此篇博客详细的讲解了linux系统上安装jenkins 步骤,是篇很好的教程. 2.[[L ...

  3. 京东二面:MySQL 主从延迟、读写分离 7 种解决方案!

    我们都知道互联网数据有个特性,大部分场景都是 读多写少,比如:微博.微信.淘宝电商,按照 二八原则,读流量占比甚至能达到 90% 结合这个特性,我们对底层的数据库架构也会做相应调整.采用 读写分离 处 ...

  4. 2023届暑期实习京东二面

    2023届暑期实习京东二面 下午一面,晚上二面,好刺激 1.研究生专业,研究方向,项目是实验室接的吗,研究内容以及应用场景 2.熟悉Python还是Java 3.项目数据模型(table)是自己设计的 ...

  5. 京东二面:内存耗尽后Redis会发生什么?

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 7 分钟. 来自:cnblogs.com/lonely-wolf/p/14403264.html # 前言 作为一台服务器来说 ...

  6. 京东二面:高并发系统如何设计?

    作为互联网从业者,高并发一直是我们绕不开的一个话题. 那么高并发系统都有哪些经验,掌握核心技巧,你可以快速成为一个架构师,主导一些高访问量系统的架构设计 然后,升职加薪自然也就是水到渠成的事. 一.负 ...

  7. 京品高科让这款“橙汁中的爱马仕”来到你身边!

    最近,怀孕五个多月的Adelina经常在办公室里喝一款橙汁饮品引起了大家不小的议论.都知道饮料里含有糖及各种添加剂,孕妇更得忌口,为何Adelina毫无顾忌呢?原来这款叫森美的橙汁饮品是Adelina ...

  8. 免费教材丨第51期:数学基础课程----概率论教程、机器学习中的数学基础

    小编说 过去几个月里,有不少人联系我,向我表达他们对人工智能.数据科学.对利用机器学习技术探索统计规律性,开发数据驱动的产品的热情.但是,我发现他们中有些人实际上缺少为了获取有用结果的必要的数学直觉和 ...

  9. 中关村创业论坛第108期:涂子沛谢耘谈中美大数据

    CNET科技资讯网 7月7日 北京消息:世界杯正热,在这个信息爆炸时代,业界纷纷基于大数据预测比赛结果.一份来自奥地利维也纳经济大学研究人员的公报声称,通过对网上博彩公司的长期赔率.各球队的历史表现和 ...

最新文章

  1. mock平台架构及实现
  2. 服务器虚拟化性能瓶颈怎么办,如何突破虚拟化三大瓶颈
  3. 在webpack和vue-cli上的rem适配终极方案
  4. 15年里,对您触动最大的中西方管理著作或思想是什么?
  5. Oracle 树操作、递归查询(select…start with…connect by…prior)
  6. 黑盒测试和白盒测试之间的差别
  7. Vue 3.0没有config文件解决方法
  8. Visio 2003 Professional
  9. 技术年货:美团技术沙龙合辑大放送——85个演讲,70+小时视频
  10. java怎么画八卦图_八卦图怎么画 最正确的八卦图
  11. wow大芒果mysql,大芒果魔兽世界3.3.5GM命令范例.doc
  12. 切图常说的@1X@2X@3X是什么意思?
  13. [Python]第一章(建议收藏)
  14. 护士人文修养测试题答案
  15. ZZ GP技术的展望——道生一,一生二
  16. 第七章第二十三题(游戏:储物柜难题)(Game: locker problem)
  17. x64dbg安装xAnalyzer插件失败问题解决
  18. C语言求一元二次方程的根,这题很简单嘛?看看这种想法很惊奇!
  19. win10蓝牙开关不见了
  20. 语音识别(ASR)技术优势都有哪些?

热门文章

  1. [bzoj3579][乱搞]破冰派对
  2. 分布式数据库中间件的实现原理介绍三:读写分离
  3. 《Activiti/Flowable  深入BPM工作流》-如何设置local流程变量?
  4. 网络原理实验2 路由器的基本配置
  5. RUST 环境 UDP UART CANFD
  6. sai简画电吉他教程
  7. linux编辑文本工具栏,LINUX-Gdit文本编辑器.ppt
  8. python文字识别模块_PYTHON如何调取OCR识别模块识别发票并输出到EXCLE? | ocr在线识别导出excle...
  9. 协会关于CFA机考考试的消息通知汇总!
  10. 重返学界!蚂蚁集团副总裁漆远加盟复旦大学!担任AI创新与产业研究院院长...