MySQL实现分布式锁

ops/2024/10/22 1:51:20/

 实现分布式锁的步骤:

  ① 准备两张表(两张表的主键相同,利用mysql的唯一约束实现分布式锁),一张用来存任务,另一张存任务的锁

  ② 从任务表中获取要执行任务的数据信息

  ③ 向任务锁表中插入当前任务,若插入成功,则拿到了任务锁,可以执行任务,否则就不能执行任务

创建数据库

#   创建任务表
create table if not exists `task`(id bigint primary key auto_increment comment '主键',description varchar(100) not null comment '任务描述'
);
#   创建任务锁表
create table if not exists `task_lock`(id bigint primary key comment '主键',description varchar(100) not null comment '任务描述'
);
#   添加任务
insert into `task`(id, description)
values(1,'说句hello world');

Java实体类

任务类

public class Task {private Long id;private String description;/*getter setter ...*/
}

任务锁类

public class TaskLock {private Long id;private String description;/*getter setter ...*/
}

mapper(直接继承的mybatisplus的BaseMapper)

public interface TaskMapper extends BaseMapper<Task> {
}
public interface TaskLockMapper extends BaseMapper<TaskLock> {
}

开启5000个线程模拟5000个服务去抢这一个任务资源

@SpringBootTest
public class LockTest {@Autowiredprivate TaskMapper taskMapper;@Autowiredprivate TaskLockMapper taskLockMapper;@Testvoid test_distributeLock_mysql() throws InterruptedException {Runnable run = () -> {//  获取id为1的任务信息Task task = taskMapper.selectById(1);//  向任务锁表中插入数据,若插入成功,代表拿到了锁,可以执行任务TaskLock taskLock = new TaskLock();taskLock.setId(task.getId());taskLock.setDescription(task.getDescription());try {taskLockMapper.insert(taskLock);//  拿到锁,执行打印任务System.out.println("hello world!");}catch (Exception e){//  未拿到锁}};List<Thread>threadPool = new ArrayList<>(5000);for (int i = 0; i < 5000; i++) {Thread thread = new Thread(run);thread.start();threadPool.add(thread);}for (Thread thread : threadPool) {thread.join();}}
}

执行结果:7b3ccd45c0434248899040e49cbe7cb3.png

可以看到5000个线程只有一个线程拿到了任务,执行完这个任务之后,其他线程也不会再次执行这个任务


http://www.ppmy.cn/ops/127441.html

相关文章

05,hive

1 &#xff0c;作用 &#xff1a; 2 &#xff0c;原理 &#xff1a; 3 &#xff0c;使用场景 &#xff1a;

【JavaEE】——自定义协议方案、UDP协议

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;自定义协议 1&#xff1a;自定义协议 &#xff08;1&#xff09;交互哪些信息 &…

C#中判断的应用说明二(switch语句)

一.判断的定义说明 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。下面是大多数编程语言中典型的判断结构的一般形式&#xff1a; 二.判…

Threejs 实现3D 地图(01)创建基本场景

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…

MySQL索引、事物与存储引擎

目录 一、MySQL索引 1.索引的概念 2.索引的作用 3.创建索引的原则依据 4.索引的分类和创建 4.1 普通索引 4.2 唯一索引 4.3 主键索引 4.4 组合索引&#xff08;单列索引与多列索引&#xff09; 4.5 全文索引&#xff08;FULLTEXT&#xff09; 5. 查看索引 6.删除索引…

matlab怎样将数据按行拼接和按列拼接(水平拼接竖直拼接)

1-将两个矩阵水平拼接 在 MATLAB 中&#xff0c;A [A, B] 是将矩阵 A 和矩阵 B 进行水平拼接的操作。具体来说&#xff0c;它是将矩阵 B 按照列的方式拼接到矩阵 A 的右边。 2-将两个矩阵竖直拼接 在 MATLAB 中&#xff0c;A [A&#xff1b; B] 是将矩阵 A 和矩阵 B 进行竖…

FPGA驱动HDMI 初级篇

简介 本章节主要讲述如何通过FPGA驱动HDMI显示。 本章节框图如下: bd框图中使用了两个IP核,分别是Video Timing controller核AXI4-Stream to video out两个模块,下面先对两个模块做介绍。 Video Timing controller 配置如下: 这里由于没有使用ZYNQ PS端,…

隐藏移动端IOS和安卓上的滚动条

直接上代码&#xff0c;就几行 ::-webkit-scrollbar {/* 不显示出来&#xff0c;安卓上会自动补上滚动条 */display: block;/* 宽度为0&#xff0c;安卓上会自动补上滚动条 */width: .5px; }::-webkit-scrollbar-thumb {/* 让看不见但是存在 */background-color: transparent;…