首页 > 其他分享 >[场景设计]超卖问题

[场景设计]超卖问题

时间:2024-08-12 23:30:17浏览次数:6  
标签:场景 CommerceGoods 扣减 lock good getInventory 设计 超卖

如果扣减库存的操作在一台机器上

使用本地锁

JVM 锁

不和数据库交互,模拟库存扣减。并发测试 100 个线程,访问50次。

private void jvmLock() {
    lock.lock();
    try {
        goods.setInventory(goods.getInventory()-1);
        log.info(goods.getInventory().toString());
    }finally {
        lock.unlock();
    }
}

不加锁出现并发问题,因为扣减和 set 不是原子操作,多个线程几乎同时拿到变量,多次扣减其实只减了一次。

用 voliate 能解决问题吗?不能,不保证原子性。

private void mysqlLock() {
        CommerceGoods good = goodsMapper.selectOne(Wrappers.lambdaQuery(CommerceGoods.class)
                .eq(CommerceGoods::getGoodsName, "lock-test")
                .select()
        );
        good.setInventory(good.getInventory()-1);
        goodsMapper.updateById(good);
        log.info(good.getInventory().toString());
    }

毫无疑问,同样会出现超卖现象。加锁解决,这是肉眼可见的并发量和吞吐量下降。

for udpate 悲观锁

select * from table where name = productName for update;

直接修改

update table set inventory = (inventory - 1) where id = 1 ;

Redis 原子操作

不加锁就不会出现超卖,而且吞吐量很高。

private void redisAtomic() {
        redisTemplate.opsForValue().decrement("lock-test");
        log.info(Objects.requireNonNull(redisTemplate.opsForValue().get("lock-test")).toString());
    }

CAS 乐观锁

update table set surplus = newQuantity where id = 1 and surplus = oldQuantity ;
private void casLock() {
        int result = 0;
        while (result==0){
            CommerceGoods good = goodsMapper.selectOne(Wrappers.lambdaQuery(CommerceGoods.class)
                    .eq(CommerceGoods::getGoodsName, "lock-test")
                    .select());
            Long inventory = good.getInventory();
            good.setInventory(good.getInventory()-1);
            result = goodsMapper.update(good,Wrappers.lambdaUpdate(CommerceGoods.class)
                    .eq(CommerceGoods::getInventory,inventory));
        }
    }

如果扣减库存的操作在多台机器上

分布式锁

标签:场景,CommerceGoods,扣减,lock,good,getInventory,设计,超卖
From: https://www.cnblogs.com/DCFV/p/18355915

相关文章

  • 事件驱动系统设计之将事件检索与事件处理解耦
    0前言part1讨论了集成过程中遇到的挑战以及幂等事件处理的作用。解决集成问题之后,我们需要反思事件检索的问题。我们的经验教训表明,将事件检索与事件处理解耦至关重要。1事件处理与请求/响应API紧耦合part1讨论了将请求/响应API集成到事件驱动微服务中时,由于基于请求/响......
  • 最新计算机专业开题报告案例65:基于springboot的农产品商场的设计与实现
    计算机毕业设计100套微信小程序项目实战java项目实战需要源码可以滴滴我目录1.选题意义2. 研究内容3.研究方法4.参考文献1.选题意义    农产品商场的建设可以促进农产品的销售和流通,将农产品直接连接到消费者,缩短流通链条,提高农产品的市场反应速度和销......
  • 设计规划专业 All In One
    设计规划专业AllInOne设计规划城市规划与设计demos西交利物浦大学当今我们生活在一个不断变化的全球环境中,中国以及世界城市发展面临着诸多挑战。城市规划(城市设计方向)硕士课程将培养学生将设计原理和技术运用到解决实际问题中。本专业将培养学生充分考虑空间设计与......
  • TensorFlow简介,应用场景,使用方法以及项目实践及案例分析,附带源代码
    一、TensorFlow简介TensorFlow是由GoogleBrain团队开发的开源机器学习库,广泛用于各种复杂的数学计算,特别是涉及深度学习的计算。它提供了丰富的工具和资源,用于构建和训练机器学习模型。TensorFlow的核心是计算图(ComputationGraph),这是一种用于表示计算流程的图结构,由节点(代表......
  • Apache Doris设计思想介绍与应用场景
    ApacheDoris设计思想介绍与应用场景   MPP(MassivelyParallelProcessing),即大规模并行处理,在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和应用特点划分到各个节点上,每台数据节点通过专用网络或者商业通用网络互相连接,彼此协同......
  • DEVCON初级使用教程结构,你可以根据自己的需求深入学习每个部分。深入了解 DEVCON 的中
    DEVCON(DeviceConsole)是一个用于管理Windows设备驱动程序和设备的命令行工具。它提供了一个用于列出、启用、禁用、安装、卸载和更新设备驱动程序的接口。以下是一个DEVCON初级使用教程的大纲,帮助你了解如何开始使用这个工具。DEVCON初级使用教程大纲1. 介绍什么是DEVCON?......
  • 拖拽式表单设计器优点体现在哪?
    降低成本、提高效率、做好数据治理,几乎是很多职场人的追求目标。可以应用什么样的平台软件打破信息孤岛的局面,实现更高效的数据整合,从而进入流程化办公新时代?低代码技术平台、拖拽式表单设计器优势特点突出,够灵活、可视化界面等,都是得到客户信赖与支持的魅力所在。通过本文,可以一......
  • Java毕业设计 基于SSM vue在线教学质量评价系统
    Java毕业设计基于SSMvue在线教学质量评价系统SSMvue在线教学质量评价系统功能介绍前端学生首页图片轮播展示登录学生注册教师展示教师详情学生评价课程信息课程详情提交选修该课学生选课学生留言个人中心后台管理员管理员登录个人中心学生管理教......
  • 高级java每日一道面试题-2024年8月12日-设计模式篇-请列举出在JDK中几个常用的设计模
    如果有遗漏,评论区告诉我进行补充面试官:请列举出在JDK中几个常用的设计模式?我回答:在JavaDevelopmentKit(JDK)中,许多设计模式被广泛使用,以帮助实现软件的结构、行为和复用。下面是一些在JDK中常见的设计模式及其简要说明:工厂模式(FactoryPattern)JDK中的java......
  • 设计模式实战:交通管理系统的设计与实现
    系统功能需求交通信号控制:管理交通信号灯的状态,如红灯、绿灯和黄灯。交通策略应用:根据不同的交通状况(如高峰期、紧急状况)应用不同的交通控制策略。交通事件监控:实时监控交通事件(如事故、交通拥堵)并通知相关部门采取行动。设计分析状态模式状态模式用于表示对象在不......