悲观锁实现一人一单+jmeter并发测试

SpringBoot实战实现分布式锁一之重现多线程高并发场景 实战前言:上篇博文我总体介绍了我这套视频课程:“SpringBoot实战实现分布式锁” 总体涉及的内容,从本篇文章开始,我将开始介绍其中涉及到的相关知识要点,感兴趣的小伙伴可以关注关注学习学习!!工欲善其事,必先利其器,介绍分布式锁使用的前因后果之前,得先想办法说清楚为啥需要分布式锁以及如何才需要将分布式锁搬上用场!! 实战概要:故而此文将介绍一下分布式锁出现的背景以及如何才能将分布式锁搬上用场(... 阅读详情

项目工程代码来自:https://gitee.com/flowers-bloom-is-the-sea/PessimisticLock/tree/version1.0/

核心代码

@Service
public class GoodsOrderServiceImpl extends ServiceImpl<GoodsOrderMapper, GoodsOrder> implements GoodsOrderService {
    @Autowired
    private IGoodsService goodsService;

    @Override
    public R buyOneGoods(Long goodsId, Long userId) {
        synchronized (userId.toString().intern()) {
            return createGoodsOrder(goodsId, userId);
        }

    }

    @Transactional
    public R<String> createGoodsOrder(Long goodsId, Long userId) {
            QueryWrapper<GoodsOrder> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("goods_id", goodsId)
                    .eq("user_id", userId);
            GoodsOrder goodsOrder = getOne(queryWrapper);
            if (goodsOrder != null) return R.fail("can not get the goods");

            Goods goods = goodsService.getById(goodsId);

            if (goods == null || goods.getStock() <= 0) return R.fail("has not any stock");//step 1

            boolean success = goodsService.update()
                    .setSql("stock = stock - 1")
                    .eq("id", goodsId)
                    .gt("stock", goods.getStock() / 3)//这里比较前后的数据是否相等,相等就可以修改库存
                    .update();//step 2

            if (!success) {
                return R.fail("has not any stock");
            }
            goodsOrder = new GoodsOrder();
        	goodsOrder.setGoodsId(goodsId);
        	goodsOrder.setUserId(userId);
        	save(goodsOrder);
            return R.success("buy one success");
    }
}

测试1:

当前goods表只有1条数据:

    id   stock  
------  --------
     1      1000

而goods_order表还没有数据。

使用postman:

测试接口:http://localhost:8081/goods/buyGoodByUserId/1/1

结果发现goods表库存减一。

goods_order表增加一个数据:

    id  user_id  goods_id  
------  -------  ----------
     1        1           1

再将goods表的库存增加到1000,使用jmeter开启1000线程测试同一个接口:

正常情况应该是没办法增加数据到goods_order表的,goods表的库存也是没有变化。

实验结果:

1、jmeter聚合报告

在这里插入图片描述

2、数据库的数据无任何变化

说明这个是成功了

测试2:

先将goods_order表的数据清空,再使用jmeter开启1000线程接口测试:

正常情况应该是1个数据插入了goods_order表,库存也是减一而已。

结果:

goods表的数据:

    id   stock  
------  --------
     1       999

goods_order的数据:

    id  user_id  goods_id  
------  -------  ----------
     2        1           1

jmeter的聚合报告:

在这里插入图片描述

项目评价:

已经实现1人一单的功能。

SAP ABAP实战:用GN_DELIVERY_CREATE批量创建内部交货单的完整代码与避坑指南 本文详细介绍了在SAP ABAP开发中使用GN_DELIVERY_CREATE函数批量创建内部交货单的完整实现方案。通过数据结构设计、多源数据整合、批量处理逻辑和错误处理机制等核心环节的深入解析,帮助开发者高效完成物流单据自动化处理,特别针对VL31N/VL32N等常见场景提供避坑指南。 阅读详情

相关推荐

手把手教你用Copilot插件在Obsidian里免费接入DeepSeek-R1(附硅基流动API密钥获取)

本文详细介绍了如何通过Copilot插件在Obsidian中免费接入DeepSeek-R1模型,实现智能知识管理。从硅基流动API密钥获取到插件配置,再到高级功能调优和实战应用技巧,手把手教你打造AI驱动的个人知识库。

weixin_33686714的博客 2795

Mysql分布式锁(三)悲观锁实现并发

Mysql分布式锁(三)悲观锁实现并发

范大的博客 892

几率大的网络安全面试题(含答案)

其他篇章:Java校招极大几率出的面试题(含答案)----汇总 本文面试题汇总: 防范常见的 Web 攻击 重要协议分布层 arp协议的工作原理 rip协议是什么?rip的工作原理 什么是RARP?工作原理 OSPF协议?OSPF的工作原理 TCP与UDP区别总结 什么是三次握手四次挥手? tcp为什么要三次握手? dns是什么?dns的工作原理 一次完整的HTTP请求过程 Cookies和ses...

睶 6万+

day4_redis中分布式锁实现一人一单

单体系统中实现一人一单 集群中实现一人一单

奋斗的龙猫的博客 2256

保姆级教程:在华为MateBook E Go上安装安卓子系统(含Hyper-V配置和地区切换避坑指南)

本文提供在华为MateBook E Go(ARM架构)上安装Windows 11安卓子系统(WSA)的详细指南。重点阐述了ARM平台无需指令转译的流畅原生体验优势,并逐步讲解启用Hyper-V虚拟化、切换系统区域以安装Amazon Appstore、配置开发人员模式及使用ADB安装第三方应用(如华为应用市场)的全过程,助您解锁高效的原生安卓应用生态。

kafka6courier的博客 539

Xilinx XDMA IP核配置实战:AXI Memory Mapped vs Stream选型指南(附PCIe调试技巧)

本文深入解析Xilinx XDMA IP核配置中AXI Memory Mapped与AXI Stream两种DMA接口的核心区别与选型策略。针对PCIe高速数据传输场景,详细对比了二者在数据特性、延迟、硬件资源及软件复杂度上的差异,为FPGA工程师在数据采集、实时处理等项目中做出高效设计决策提供实战指南,并附有关键的PCIe调试技巧。

qsc901234的博客 585

异步简单实现一人一单

简单实现一下异步线程执行同一业务,提高访问效率

ws_please的博客 589

单细胞测序数据读取实战指南:从入门到精通

本文提供了单细胞测序数据读取的实战指南,涵盖从标准10X Genomics格式到通用表达矩阵及RDS文件的读取方法。文章重点解析了数据读取的核心步骤、常见问题解决方案及进阶技巧,旨在帮助用户夯实数据分析基础,确保后续分析流程的准确性。

weixin_29095587的博客 460

悲观锁MySQL_【mysql】关于悲观锁

关于mysql中的锁在并发环境下,有可能会出现脏读(Dirty Read)、不可重复读(Unrepeatable Read)、 幻读(Phantom Read)、更新丢失(Lost update)等情况,所以mysql引入了很多锁的概念MySQL InnoDB对数据行的锁定类型一共有四种:共享锁(读锁,S锁)、排他锁(写锁,X锁)、意向共享锁(IS锁)和意向排他锁(IX锁),支持三种行锁定方式:行...

weixin_39886547的博客 182

揭秘大数据领域数据产品的开发流程

随着企业数字化转型加速,数据产品已成为驱动业务增长的核心载体。不同于传统软件产品,数据产品以数据为核心生产要素,通过数据采集、处理、分析与可视化,为用户提供决策支持或智能化服务。本文旨在系统性拆解数据产品开发的全生命周期,涵盖需求分析、数据工程、模型构建、产品设计、上线运维等关键环节,揭示各阶段的技术原理、实施路径与最佳实践,帮助技术团队与产品团队建立标准化开发流程。核心概念:定义数据产品本质,对比传统软件产品差异技术体系:拆解数据采集、处理、建模、可视化的技术栈与算法原理。

AI Agent Harness Engineering 480

osg点云加载与渲染

osg点云加载与渲染

cangqiongxiaoye的博客 821

【Redis】电商项目秒杀问题之超卖问题与一人一单问题

在如双11等购物需求剧增的背景下,一个物品库存里有100件但是由于并发等问题可能会导致该物品被卖出超过100件。这就是超卖问题,他是由于库存量被高并发请求而产生的线程安全问题。

qq_61903414的博客 4617

2021年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。现在从m位中删除k位(0

人生就是一个不断学习的过程 1011

【Redis场景4】单机环境下秒杀问题

【Redis场景4】单机环境下秒杀问题;涉及到并发问题,库存超卖问题,一人一单秒杀问题等,相关场景进行压测,不局限于文字,注重实操。

在长期主义之路上,与伟大格局观者同行,做时间的朋友。 403

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

PHP+JMeter模拟测试高并发场景。附代码。

php+Jmeter模拟高并发场景

最美不过下雨天 1430

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

记录使用jmeter测试扣减库存和修改库存高并发执行是否发生数据不一致问题

问题描述:ERP系统业务方反馈调取修改商城库存接口后,商城库存没有改变,需要验证修改库存和扣减库存并发执行时,是否发生了覆盖,导致数据不一致的问题。 1、测试demo 从代码分析,扣减库存,使用的是悲观锁。 2、使用jmeter高并发扣减库存 一个商品初始化库存5000,并发执行100个线程同时扣减库存,循环40次,预期累计扣减库存4000,经过测试库存扣减正常,并没有多扣或少扣,商品最后库存1000,说明扣减库存的悲观锁是正常运行的。 3、高并发执行扣减库存操作时,同时调取修改库存接口,验证修改

thunder-1 990

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

采用jmeter进行抢购商品的压力测试

测试内容 疫情物资抢购项目提供了三种解决方案来比较系统性能: 1.利用MySQL的update行锁实现悲观锁。 2.MySQL加字段version实现乐观锁。 3.添加Redis缓存; 使用了JMeter在保证错误率为零的基础上,进行压力与性能测试(实验设置的是10秒内产生3000个请求或酌情5000个请求),分析每秒处理请求数、平均响应时间、等参数,最后得出相应结论。 测试步骤 1.建立线程组 ...

我的技术日常 1296

【黑马点评】面试题总结(通俗易懂版)

利用set nx ex 获取锁(set nx充满互斥性)(利用set ex保证故障时锁依然能释放,记住这句话,就是为了避免死锁 提高安全性)(利用redis集群保证高可用和高并发特性)并设置过期时间,保存线程标示释放锁时先判断线程标示是否一致,一致则删除锁Ression分布式锁可重入是指在同一线程可以多次获取同一把锁比如a要调用b,同时a要获取锁,b也要获取同一把锁,如果不可重入,则b就获取不了锁,要等a释放锁,b才可以获取锁,如果可重入,则能同时获取锁不可重入:同一线程不可以获取同一把锁。

易琳的博客 2万+

【三十】springboot项目上高并发解决示例

springboot项目上高并发解决示例

weixin_56995925的博客 5896

thinkphp6使用mysql悲观锁解决商品超卖问题

悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 使用场景举例:以MySQL InnoDB为例 商品goods表,假设商品的id为1,购买数量为1,status为1表示上架中,2表示下架。现在用户购买此商品

温建平的博客 1986

秒杀系统(详解)基于SpringBoot实现(持续更新中)

秒杀系统1、什么是秒杀2、秒杀的问题2.1、超卖2.2、高并发2.3、恶意请求2.4、高性能3、解决方法4、项目落地实现4.1、数据库准备4.2、项目创建5、JMeter压力测试工具安装5.1、JMeter介绍(百度百科)5.2、下载安装(需要Java 8+)5.3、使用5.3.1、UI界面的使用(官方不推荐)5.3.2、命令行(官方推荐)6、超卖情况6.1、代码实现6.2、单点测试(非高并发)6.3、JMeter测试6.3.1、创建随机数6.3.2、运行观察结果7、解决超卖(悲观锁)7.1、解释7.2、.

它叫当当的博客 8038

13年测试经验,性能测试-高并发处理详细,一篇彻底通透...

涉及抢购、秒杀、抽奖、抢票等活动时,为了避免超卖,那么库存数量是有限的,但是如果同时下单人数超过了库存数量,就会导致商品超卖问题。那么我们怎么来解决这个问题呢?sql1 : 查询商品库存 if(库存数量 > 0) {// 生成订单 . . . sql2 : 同时库存 - 1 }当没有并发时,上面的流程看起来是再正常不过了,假设同时两个人下单,而库存只有1个了,在sql1阶段两个人查询到的库存都是>0的,于是最终都执行了sql2,库存最后变为-1,超售了,这不是我们想要的结果吧。解决这个问题思路。

测试逍遥子的博客 781

微服务 Spring Boot 整合Redis 实现优惠卷秒杀 一人一单

在操作时,对版本号进行+1 操作,然后要求version 如果是1 的情况下,才能操作,那么第一个线程在操作后,数据库中的version变成了2,但是他自己满足version=1 ,所以没有问题,此时线程2执行,线程2 最后也需要加上条件version =1 ,但是现在由于线程1已经操作过了,所以线程2,操作时就不满足version=1 的条件了,所以线程2无法执行成功。之前的方式要修改前后都保持一致,但是这样我们分析过,成功的概率太低,所以我们的乐观锁需要变一下,改成stock大于0 即可。

GY的的专栏 872

测试必学知识系列之:幂等与加锁

幂等和加锁,系统核心流程中的 “双保险”,别在傻傻分不清!

程序员小杨哥的博客 952

实现高并发秒杀的 7 种方式

一、二方式是在代码中利用锁和事务的方式解决了并发问题,主要解决的是锁要加载事务之前三、四、五方式主要是数据库的锁来解决并发问题,方式三是利用for upate对表加行锁,方式四是利用update来对表加锁,方式五是通过增加version字段来控制数据库的更新操作,方式五的效果最差六、七方式是通过队列来解决并发问题,这里需要特别注意的是,在代码中不能通过throw抛异常,否则消费线程会终止,而且由于进队和出队存在时间间隙,会导致商品少卖上面所有的情况都经过代码测试,测试分一下三种情况:

qq_45228323的博客 1331

多服务器节点访问解决一人一单问题+redis设置锁方案

和实现多点登录的一些思路有一些类似的,都是将一些数据放到第三方服务

ws_please的博客 488
上一篇: 乐观锁在超卖问题上的应用实现+原理
下一篇: 多服务器节点访问解决一人一单问题+redis设置锁方案
xin麒
博客等级 码龄6年 110粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值