优惠券领劵接口-Jmeter压测扣超发优惠券问题暴露

简介:Jmeter压测领劵接口-超发优惠券问题暴露

  • 新建接口压测计划

  • 压测领劵接口

  • 完成xml编写

    <!--扣减库存--><update id="reduceStock">update coupon set stock=stock-1 where id = #{couponId}</update>
    
  • 问题

    • 扣减存储为负数,超发优惠券
    • 给公司造成资损

高并发下怎样优雅的保证扣减库存数据的正确性

简介:高并发下扣减库存的常见解决方案介绍

  • 这里不谈秒杀设计,不谈使用队列等使请求串行化,

    • 秒杀的话:限流、队列、异步,可以看小滴课堂专题视频
  • 我们谈下怎么用锁来保证数据正确,防止超发导致库存是负数,你能下想几种方式

    先看下面的是精简版的时序图

    • 同步代码块synchronized ,lock
    public synchronized void reduceCouponStock(long couponId ,Integer num) {
    //业务逻辑
    }问题:synchronized 作用范围是单个jvm实例, 如果做了集群分布式等,就失效了,且单机JVM加锁后就是串行等待问题
    
    • 分布式锁 zookeeper,redis (后续会讲到分布式锁的知识)
    可以解决问题问题:过于笨重,性能有所下降
    
    • 直接数据库更新扣减
    update coupon set stock=stock - #{num} where id = #{couponId} and stock>0
    //测试如果num大于已有库存,则会变负数
    update coupon set stock=stock - #{num} where id = #{couponId} and (stock - #{num})>=0
    或者
    update coupon set stock=stock - #{num} where id = #{couponId} and stock >= #{num}
    //修复了负数问题
    • 如果扣减最多1个,则直接使用这种就行
    update coupon set stock=stock-1 where id = #{couponId} and stock>0 延伸
    update coupon set stock=stock-1 where id = #{couponId} and stock = #{oldStock}
    问题:扣减库存,如果别人补充库存,就存在ABA问题,看业务是否有这个限制,大课采用上面那种
    比如
    C线程查出来是10个
    A线程扣减1个,剩9个
    B线程更新了库存,变回10个
    C更新的时候发现还是10个,则更新成功, 所以避免这个问题,要求不管谁修改了库存,一定要加个version递增版本号update coupon set stock=stock-1,version=version+1 where id = #{couponId} and stock>0 and versoin=#{oldVersion}
    
  • 代码编写

<!--扣减库存,如果别人补充库存,则可能存在ABA问题--><update id="reduceStock">update coupon set stock=stock-1 where id = #{couponId} and stock>0</update>

大厂面试热身赛-天猫超市-二面面试题-P7技术专家岗

简介:大厂面试题,高并发库存扣减超卖问题解决,多种sql适合场景

  • 题目:高并发库存扣减超卖问题,很多人加了乐观锁版本号去解决,那下面三种有什么区别,分别适合哪些场景使用
1)update product set stock=stock-1 where id = 1 and stock>02)update product set stock=stock-1 where stock=#{原先查询的库存}  and id = 1 and stock>03)update product set stock=stock-1,versioin = version+1 where  id = 1 and stock>0 and version=#{原先查询的版本号}
  • 答案 : 核心是解决超卖的问题,就是防止库存为负数
方案一:id是主键索引的前提下,如果每次只是减少1个库存,则可以采用上面的方式,只做数据安全
校验,可以有效减库存,性能更高,避免大量无用sql,只要有库存就也可以操作成功.
场景:高并发场景下的取号器,优惠券发放扣减库存等方案二:使用业务自身的条件做为乐观锁,但是存在ABA问题,对比方案三的好处是不用增加version版本字段。如果只是扣减库存且不在意ABA问题时,则可以采用上面的方式,但业务性能相对方案一就差了点,因为库存变动后sql就会无效方案三:增加版本号主要是为了解决ABA问题,数据读取后,更新前数据被别人篡改过,version只能做递增
场景:商品秒杀、优惠券方法,需要记录库存操作前后的业务三个方案各有利弊,看业务场景而定

高并发超发优惠券问题相关推荐

  1. 高并发超卖问题简要解决方案

    1.传统通过数据库保证不超卖 事务+行锁并不是解决超卖的方案,只是保障数据的统一性.传统通过回滚事务的方式防止某些用户多卖的情况. 采用新建一个防重表+事务的方式防止超卖.同一事务中,采用如 用户ID ...

  2. 解决高并发的问题python_python ---解决高并发超卖问题

    使用redis 解决美多商城超卖的问题 import redis r = redis.Redis(host='localhost', port=6379) #定义过载 def limit_handle ...

  3. 每天高并发超千万订单,滴滴的计价系统是如何构建的?

    桔妹导读:计价是出行业务中非常重要的一部分.在滴滴,不同的业务有不同的计价方式,比如网约车不仅有根据里程.时长.时段等进行的分时计价,在拼车.特惠快车等场景还支持一口价,青桔则主要基于起步价和时长费等 ...

  4. [SpringBoot][15][SpringBoot处理高并发]

    第 15 章 SpringBoot处理高并发 在企业实际应用中,会遇到很多高并发场景,最典型的例子就是双十一的抢购.这时候,如果仅仅按照之前简单的方式进行处理,不仅性能无法保证,而且有可能导致数据库某 ...

  5. 高并发-【抢红包案例】之二:使用悲观锁方式修复红包超发的bug

    文章目录 概述 超发问题分析 使用数据库锁的解决方案 使用悲观锁(排它锁 for update) 使用乐观锁(依靠表的设计和代码) 总结 悲观锁(抽象的描述,不真实存在这个锁) 共享锁(S锁) 排他锁 ...

  6. 面试题之优惠券超发怎么测试?

    你好 我是懂java的测试 前言 刚毕业那会,本人意外获得拼夕夕的面试机会,在聊到优惠券库存扣减场景时,面试官问了一连串经典的问题:"优惠券库存怎么扣减的?开发为了解决超发优惠券问题而设计的 ...

  7. 拼夕夕面试题之优惠券超发怎么去测试?

    刚毕业那会,本人意外获得拼夕夕的面试机会,在聊到优惠券库存扣减场景时,面试官问了一连串经典的问题:"优惠券库存怎么扣减的?开发为了解决超发优惠券问题而设计的方案,了解过吗?你又是如何测试的呢 ...

  8. SpringBoot、Redis轻松实现Java高并发秒杀系统笔记

    秒杀项目 优极限[完整项目实战]半天带你用SpringBoot.Redis轻松实现Java高并发秒杀系统 文章目录 秒杀项目 技术栈 课程介绍 学习目标 如何设计一个秒杀系统 项目搭建 分布式会话 登 ...

  9. 高并发-【抢红包案例】之三:使用乐观锁方式修复红包超发的bug

    文章目录 导读 乐观锁 CAS 原理 ABA问题 库表改造 代码改造 RedPacketDao新增接口方法及Mapper映射文件 UserRedPacketServic接口及实现类的改造 Contro ...

最新文章

  1. VIM-多文件-多窗口
  2. 我国身家超过亿元的有多少人?
  3. 像Java这样的C ++具有低延迟
  4. 关于SpringCloud微服务云架构构建B2B2C电子商务平台之- Spring Cloud集成项目简介(三)...
  5. SpringCloudGateway(一) 概览
  6. 并发编程(进程与线程)
  7. java arraylist_Java 集合框架之 ArrayList 源码图示法简要剖析
  8. 数据通信与网络技术之网络基础
  9. Eclipse安装包下载慢解决方法
  10. SQL编程题练习题(基础)
  11. python输入直角三角形两条直角边、输出斜边长_python直角三角形的两个直角边、求斜边_直角三角形斜边公式计算器 两个直角边边长的平方加起来等......
  12. 没考计算机水平怎么填6,“计算机水平”怎么填,没曾考级,只参加过大 – 手机爱问...
  13. HOOPS 3DGS技术概述
  14. 轻松在Google Chrome浏览器中管理您的电子邮件
  15. java 相似度匹配算法
  16. 华工计算机工程学院,计算机工程学院赴华工兄弟学院交流学习
  17. linux终端声音设置,终端命令设置音量?
  18. 光脚丫学LINQ(006):投影
  19. php导入excel中文手册,使用PHP导入Excel和导出数据为Excel文件
  20. apple pencil必须要买吗?性价比平替电容笔排行榜

热门文章

  1. unity中辅助类Gizmos说明
  2. [CodeChef]Points Inside A Polygon
  3. Mysql字符串数字排序
  4. EspTouchForiOS 的集成使用
  5. TOM企业邮箱:界面极简,免费无限空间
  6. python的global函数学习
  7. Android代码规范_持续更新
  8. js修改对象数组中其中某一项属性值
  9. python用turtle画彩虹_Python语言,绘制彩虹场景
  10. 运用python画光刻板版图-2函数讲解