⼲货分享:SpringBoot基于数据库实现简单的分布式锁本⽂介绍SpringBoot基于数据库实现简单的分布式锁。
⼀.简介
分布式锁的⽅式有很多种,通常⽅案有:
基于mysql数据库
基于redis
基于ZooKeeper
⽹上的实现⽅式有很多,本⽂主要介绍的是如果使⽤mysql实现简单的分布式锁,加锁流程如下图:
其实⼤致思想如下:
1.根据⼀个值来获取锁(也就是我这⾥的tag),如果当前不存在锁,那么在数据库插⼊⼀条记录,然后进⾏处理业务,当结束,释放
锁(删除锁)。
2.如果存在锁,判断锁是否过期,如果过期则更新锁的有效期,然后继续处理业务,当结束时,释放锁。如果没有过期,那么获取锁失
败,退出。
圈⼦
⼆、数据库设计
2.1 数据表介绍
数据库表是由JPA⾃动⽣成的,稍后会对实体进⾏介绍,内容如下:
其中:
id:主键
tag:锁的标⽰,以订单为例,可以锁订单id
expiration_time:过期时间
status:锁状态,0,未锁,1,已经上锁
圈⼦
三、.实现
本⽂使⽤SpringBoot 2.0.3.RELEASE,MySQL 8.0.16,ORM层使⽤的JPA。
3.1 pom
新建项⽬,在项⽬中加⼊jpa和mysql依赖,完整内容如下:
3.2 配置⽂件
配置⽂件配置了⼀下数据库信息和jpa的基本配置,如下:
3.3 实体类
实体类如下,这⾥给tag字段设置了唯⼀索引,防⽌重复插⼊相同的数据:
3.4 repository
repository层只添加了两个简单的⽅法,根据tag查锁和根据tag删除锁的操作,内容如下:
3.5 service
service接⼝定义了两个⽅法,获取锁和释放锁,内容如下:
实现类对上⾯⽅法进⾏了实现,其内容与上述流程图中⼀致,这⾥不在做介绍,完整内容如下:
3.6 测试类
创建了⼀个测试的controller进⾏测试,⾥⾯写了⼀个test⽅法,⽅法在获取锁的时候会sleep 2秒,便于我们进⾏测试。完整内容如下:spring到底是干啥的
四、测试
项⽬使⽤maven打包,分别使⽤两个端⼝启动,分别是20000和20001。
java -jar springboot2_distributed_lock_mysql-0.0.1-SNAPSHOT.jar --server.port=20001 java -jar springboot2_distributed_lock_mysql-0.0.1-SNAPSHOT.jar 分别访问两个端⼝的项⽬,如图所⽰,只有⼀个请求可以获取锁。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。