全栈小白的gravatar头像
全栈小白 2023-01-08 06:30:01

案例-MySQL自定义排序(维护一个序号)-并发惹的祸

项目描述

本案例的设计初衷是在实际开发中的一次场景,有一个商品表,要求商品支持自定义排序,那实现思路大概是维护一个product_order字段,从1开始,自定义排序时修改商品所属顺序即可,本文分别从不同的项目架构方式来说明其实现思路,

说说问题,简单的实现思路是在插入商品之前,先查询其数据库中的最大order,该商品的order=最大order+1,这种方式是有问题的,其罪魁祸首是并发导致的线程不安全

案例中使用postman批量发送100个请求、jmeter压测工具模拟100个线程分别测试,注意,我是分开描述的,两种方式有区别,然后使用jvm锁解决其线程安全问题,之后搭建了集群环境,以同样的方式测试,其结果是集群环境jvm锁无法满足其项目所需,对于集群环境,本案例会有两种解决方案,一种是基于MySQL行级锁,一种是使用Redis分布式锁

我已经将案例步骤写个一个pdf文档,都会在压缩包中包含,里面包含基于单体架构的实现、基于MySQL行锁的实现方式、基于简单Redis分布式锁的实现方式,包括集群搭建都会有步骤

运行环境

jdk8+tomcat9+mysql5.7+IntelliJ IDEA+maven+centos8

项目技术(必填)

springboot+mybatis-plus+jmeter

数据库文件(可选)

create table t_product_info(
    product_id int primary key auto_increment comment '商品id',
    product_name varchar(50) comment '商品名',
    product_order int not null comment '商品序号',
    create_time datetime comment '创建时间'
) comment '商品表';

是否原创(转载必填原文地址)

原创

资源包文件(可选)

链接: https://pan.baidu.com/s/1tibWT-Ng3UQuZl3cYT3v9w?pwd=neq7 提取码: neq7

项目截图(必填)

案例-MySQL自定义排序(维护一个序号)-并发惹的祸

运行截图(必填)

使用jmeter模拟100个并发对接口进行测试

案例-MySQL自定义排序(维护一个序号)-并发惹的祸案例-MySQL自定义排序(维护一个序号)-并发惹的祸顺序已经出现了问题,线程安全问题出现了,使用jvm锁解决后,可以保证顺序的正确性

集群架构图(来源于百度图片)

案例-MySQL自定义排序(维护一个序号)-并发惹的祸

针对jvm解决后的项目搭建集群,使用jmeter对集群进行测试

案例-MySQL自定义排序(维护一个序号)-并发惹的祸

案例-MySQL自定义排序(维护一个序号)-并发惹的祸其测试结果,不出所料,又拉垮了

使用MySQL行级锁后的集群测试

案例-MySQL自定义排序(维护一个序号)-并发惹的祸使用Redis分布式锁后的集群测试

案例-MySQL自定义排序(维护一个序号)-并发惹的祸

注意事项(可选)

本人所发内容及涉及源码,均为亲手所撸,如总结内容有误,欢迎指出

本项目只是一个案例,无任何项目价值,使用代码分析其线程安全问题并给出不同架构方式的解决方案,对于新手来说,有学习价值,深刻体会,必有收获,慎重下载

源码中包含单体解决方案、MySQL行级锁、Redis分布式锁解决方案源码,及详细操作笔记一份,jmeter压测工具见资源包链接


打赏

已有1人打赏

最代码官方的gravatar头像

文件名:distributed-lock-demo.zip,文件大小:2336.52K 下载
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友