首页 > 数据库 >基于数据库实现分布式锁

基于数据库实现分布式锁

时间:2024-03-28 19:56:27浏览次数:27  
标签:COMMENT 基于 name DEFAULT 数据库 线程 method 分布式

基于数据库实现分布式锁

实现

1. 创建表
CREATE TABLE `methodLock` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `method_name` varchar(64) NOT NULL DEFAULT '' COMMENT '锁定的方法名',
  `desc` varchar(1024) NOT NULL DEFAULT '备注信息',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '保存数据时间,自动生成',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uidx_method_name` (`method_name `) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='锁定中的方法';

 

2. 获取锁

想要锁住某个方法时,执行以下 SQL:

insert into methodLock(method_name,desc) values (‘method_name’,‘desc’)

因为我们对 method_name 做了唯一性约束,这里如果有多个请求同时提交到数据库的话,数据库会保证只有一个操作可以成功,那么我们就可以认为操作成功的那个线程获得了该方法的锁,可以执行方法体内容。

成功插入则获取锁。

3. 释放锁

当方法执行完毕之后,想要释放锁的话,需要执行以下 Sql:

delete from methodLock where method_name ='method_name'

 

问题

  1. 这把锁强依赖数据库的可用性。如果数据库是一个单点,一旦数据库挂掉,会导致业务系统不可用。
  2. 这把锁没有失效时间,一旦解锁操作失败,就会导致锁记录一直在数据库中,其他线程无法再获得到锁。
  3. 这把锁只能是非阻塞的,因为数据的 insert 操作,一旦插入失败就会直接报错。没有获得锁的线程并不会进入排队队列,要想再次获得锁就要再次触发获得锁操作。
  4. 这把锁是非重入的,同一个线程在没有释放锁之前无法再次获得该锁。因为数据中数据已经存在了。

解决办法

  1. 单点问题可以用多数据库实例,同时塞 N 个表,N/2+1 个成功就任务锁定成功
  2. 写一个定时任务,隔一段时间清除一次过期的数据。
  3. 写一个 while 循环,不断的重试插入,直到成功。
  4. 在数据库表中加个字段,记录当前获得锁的机器的主机信息和线程信息,那么下次再获取锁的时候先查询数据库,如果当前机器的主机信息和线程信息在数据库可以查到的话,直接把锁分配给他就可以了。

小结

  • 优点: 直接借助数据库,容易理解。
  • 缺点: 会有各种各样的问题,在解决问题的过程中会使整个方案变得越来越复杂。操作数据库需要一定的开销,性能问题需要考虑。

标签:COMMENT,基于,name,DEFAULT,数据库,线程,method,分布式
From: https://www.cnblogs.com/myf008/p/18102487

相关文章

  • Oracle查询数据库万能SQL
    Oracle数据库表简要说明数据库表描述USER开头的只能查询自身用户的表DBA开头的最高权限,只能用sys、system用户才能查询CDB开头的ContainerDatabase数据库容器,ORACLE12版本引入ALL开头的sys、system、普通用户都能查查询数据库表--查询数据......
  • Mysql数据库——主从复制与读写分离
    目录前言一、主从复制1.主从复制的定义2.Mysql主从复制支持的类型3.主从复制的过程4. 主从复制出现的问题5.解决方法二、读写分离1.读写分离的定义2.读写分离的作用3.读写分离作用场景3.1基于程序代码内部实现3.2基于中间代理层实现4.主从复制与读写分离三、搭......
  • 【腾讯云HAI】基于腾讯云HAI部署Stable Diffusion进行图像创作
    toc一、前言在深度学习领域,稳定扩散(StableDiffusion)是一种强大的生成模型,近年来备受关注。稳定扩散模型通过逐步将噪声信号转化为目标图像,实现了高质量图像生成的突破性进展。相较于传统的生成对抗网络(GAN)等模型,稳定扩散技术在生成图像时展现出更加稳定和可控的特性,为图......
  • 基于JAVA SSM 实现【房屋租赁系统】(内附设计文档 + PPT+ 源码 下载)
    房屋租赁系统项目技术栈该项目采用了以下核心技术栈:后端框架/库:Java,ssm数据库:MySQL5.7前端技术:HTML,CSS,JavaScript服务器:Tomcat7开发工具:Eclipse/MyEclipse/IDEA,NavicatforMySQL项目展示5.1前台首页功能模块图5-1前台首页界面图首页展示了房源信息......
  • Android基于MediaBroswerService的App实现概述,android零基础入门
    谷歌官方提供了MediaBroswerService,通过其可以帮助我们实现上述的需求。MediaBroswerServiceAndroid多媒体架构Android多媒体播放采用client,server架构,一个server可以对应多个client,client在使用的时候需要先连接到server,双方通过设置的一些callback来进行状态的同步。......
  • (1),深入分布式缓存从原理到实践技术分享
    carry=sum/10;if(l1){l1=l1->next;}if(l2){l2=l2->next;}}if(carry>0){tail->next=newListNode(carry);}returnhead;}ListNode*addTwoNumbers(ListNode*l1,ListNode*l2){ListNode*result=newListNode(-1);ListNode*......
  • 【数据库】PostgreSQL中使用`SELECT DISTINCT`和`SUBSTRING`函数实现去重查询
    在PostgreSQL中,我们可以使用SELECTDISTINCT和SUBSTRING函数来实现对某个字段进行去重查询。本文将介绍如何使用这两个函数来实现对resource_version字段的去重查询。1.SELECTDISTINCT语句SELECTDISTINCT语句用于从表中选择不重复的记录。如果没有指定列名,则会选择所有列。在......
  • 瑞芯微-I2S | 音频驱动调试基本命令和工具-基于rk3568-2
    基于Linux嵌入式设备常用调试方法很多,本文一口君把调试语音用到的工具和方法给大家做一个简单的介绍。1.procfs、sysfsLinux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的......
  • 基于 DYNAMIXEL XL330 舵机的5自由度机械臂
    完整视频链接:https://www.bilibili.com/video/BV1Yz421f7AK/?spm_id_from=333.999.0.0&vd_source=9456951d706e2acc026e424d8a228909 ProjectDescription:A5DOFrobotarmusingtheDynamixelXL-330andArduinoMKR.Allpartsoftherobotarmare3Dprintedusing......
  • 数据库的创建与模糊查询
    数据库名称可以为【schoolDB】,字符集【utf8】,排列规则【utf8_general_ci】。创建表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)......