高并发超发优惠券问题
优惠券领劵接口-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.传统通过数据库保证不超卖 事务+行锁并不是解决超卖的方案,只是保障数据的统一性.传统通过回滚事务的方式防止某些用户多卖的情况. 采用新建一个防重表+事务的方式防止超卖.同一事务中,采用如 用户ID ...
- 解决高并发的问题python_python ---解决高并发超卖问题
使用redis 解决美多商城超卖的问题 import redis r = redis.Redis(host='localhost', port=6379) #定义过载 def limit_handle ...
- 每天高并发超千万订单,滴滴的计价系统是如何构建的?
桔妹导读:计价是出行业务中非常重要的一部分.在滴滴,不同的业务有不同的计价方式,比如网约车不仅有根据里程.时长.时段等进行的分时计价,在拼车.特惠快车等场景还支持一口价,青桔则主要基于起步价和时长费等 ...
- [SpringBoot][15][SpringBoot处理高并发]
第 15 章 SpringBoot处理高并发 在企业实际应用中,会遇到很多高并发场景,最典型的例子就是双十一的抢购.这时候,如果仅仅按照之前简单的方式进行处理,不仅性能无法保证,而且有可能导致数据库某 ...
- 高并发-【抢红包案例】之二:使用悲观锁方式修复红包超发的bug
文章目录 概述 超发问题分析 使用数据库锁的解决方案 使用悲观锁(排它锁 for update) 使用乐观锁(依靠表的设计和代码) 总结 悲观锁(抽象的描述,不真实存在这个锁) 共享锁(S锁) 排他锁 ...
- 面试题之优惠券超发怎么测试?
你好 我是懂java的测试 前言 刚毕业那会,本人意外获得拼夕夕的面试机会,在聊到优惠券库存扣减场景时,面试官问了一连串经典的问题:"优惠券库存怎么扣减的?开发为了解决超发优惠券问题而设计的 ...
- 拼夕夕面试题之优惠券超发怎么去测试?
刚毕业那会,本人意外获得拼夕夕的面试机会,在聊到优惠券库存扣减场景时,面试官问了一连串经典的问题:"优惠券库存怎么扣减的?开发为了解决超发优惠券问题而设计的方案,了解过吗?你又是如何测试的呢 ...
- SpringBoot、Redis轻松实现Java高并发秒杀系统笔记
秒杀项目 优极限[完整项目实战]半天带你用SpringBoot.Redis轻松实现Java高并发秒杀系统 文章目录 秒杀项目 技术栈 课程介绍 学习目标 如何设计一个秒杀系统 项目搭建 分布式会话 登 ...
- 高并发-【抢红包案例】之三:使用乐观锁方式修复红包超发的bug
文章目录 导读 乐观锁 CAS 原理 ABA问题 库表改造 代码改造 RedPacketDao新增接口方法及Mapper映射文件 UserRedPacketServic接口及实现类的改造 Contro ...
最新文章
- VIM-多文件-多窗口
- 我国身家超过亿元的有多少人?
- 像Java这样的C ++具有低延迟
- 关于SpringCloud微服务云架构构建B2B2C电子商务平台之- Spring Cloud集成项目简介(三)...
- SpringCloudGateway(一) 概览
- 并发编程(进程与线程)
- java arraylist_Java 集合框架之 ArrayList 源码图示法简要剖析
- 数据通信与网络技术之网络基础
- Eclipse安装包下载慢解决方法
- SQL编程题练习题(基础)
- python输入直角三角形两条直角边、输出斜边长_python直角三角形的两个直角边、求斜边_直角三角形斜边公式计算器 两个直角边边长的平方加起来等......
- 没考计算机水平怎么填6,“计算机水平”怎么填,没曾考级,只参加过大 – 手机爱问...
- HOOPS 3DGS技术概述
- 轻松在Google Chrome浏览器中管理您的电子邮件
- java 相似度匹配算法
- 华工计算机工程学院,计算机工程学院赴华工兄弟学院交流学习
- linux终端声音设置,终端命令设置音量?
- 光脚丫学LINQ(006):投影
- php导入excel中文手册,使用PHP导入Excel和导出数据为Excel文件
- apple pencil必须要买吗?性价比平替电容笔排行榜