返回顶部
首页 > 资讯 > 数据库 >怎么在MySQL中利用DB实现分布式锁
  • 489
分享到

怎么在MySQL中利用DB实现分布式锁

2024-04-02 19:04:59 489人浏览 泡泡鱼
摘要

怎么在Mysql中利用DB实现分布式锁?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。表设计首先要明确DB在系统中仍然需要认为是最脆弱的一环,因

怎么在Mysql中利用DB实现分布式?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

表设计

首先要明确DB在系统中仍然需要认为是最脆弱的一环,因此在设计时需要考虑压力问题,即能应用实现的逻辑就不要放到DB上实现,也就是尽量少使用DB提供的锁能力,如果是高并发业务则要避免使用DB锁,换成Redis缓存锁更加有效。如清单1所示,该表中唯一的约束为lock_name,timestamp,version三者组合主键,下文会利用这三者实现悲观锁,乐观锁等业务场景。

清单1: 分布式锁表结构

CREATE TABLE `lock` (
`lock_name` varchar(32) NOT NULL DEFAULT '' COMMENT '锁名称',
`resource` bigint(20) NOT NULL COMMENT '业务主键',
`version` int(5) NOT NULL COMMENT '版本',
`gmt_create` datetime NOT NULL COMMENT '生成时间',
PRIMARY KEY (`lock_name`,`resource`,`version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

悲观锁实现

对于悲观锁业务中常见的操作有以下两种:

怎么在MySQL中利用DB实现分布式锁

针对A:

A场景当一台机器获取到锁后,其他机器处于排队状态,锁释放后其他机器才能够继续下去,这种应用层面解决是相当麻烦,因此一般使用DB提供的行锁能力,即select xxx from xxx for update。A场景一般都和业务强关联,比如库存增减,使用业务对象作为行锁即可。需要注意的是,该方案本质上锁压力还是在数据库上,当阻塞住的线程过多,且操作耗时,最后会出现大量锁超时现象。

针对B:

针对B场景(tryLock)举个具体业务,在集群下每台机器都有定时任务,但是业务上要求同一时刻只能有一台能正常调度。
解决思路是利用唯一主键约束,插入一条针对TaskA的记录,版本则默认为1,插入成功的算获取到锁,继续执行业务操作。这种方案当机器挂掉就会出现死锁,因此还需要有一个定时任务,定时清理已经过期的锁,清理维度可以根据lock_name设置不同时间清理策略。

定时任务清理策略会额外带来复杂度,假设机器A获取到了锁,但由于CPU资源紧张,导致处理变慢,此时锁被定时任务释放,因此机器B也会获取到锁,那么此时就出现同一时刻两台机器同时持有锁的现象,解决思路:把超时时间设置为远大于业务处理时间,或者增加版本机制改成乐观锁。

insert into lock set lock_name='TaskA' , resource='锁住的业务',version=1,gmt_create=now()
success: 获取到锁
failed:放弃操作
释放锁

乐观锁实现

针对乐观锁场景,举个具体业务,在后台系统中经常使用大JSON扩展字段存储业务属性,在涉及部分更新时,需要先查询出来,合并数据,写入到DB,这个过程中如果存在并发,则很容易造成数据丢失,因此需要使用锁来保证数据一致性,相应操作如下所示,针对乐观锁,不存在死锁,因此这里直接存放业务id字段,保证每一个业务id有一条对应的记录,并且不需要对应的定时器清除。

select * from lock where lock_name='业务名称', resource='业务id';
不存在: insert into lock set lock_name='业务名称', resource='业务id' , version=1;
获取版本: version
业务操作: 取数据,合并数据,写回数据
写回到DB: update lock set version=version+1 where lock_name='业务名称' and resource='业务id' and version= #{version};
写回成功: 操作成功
写回失败: 回滚事务,从头操作

看完上述内容,你们掌握怎么在mysql中利用DB实现分布式锁的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: 怎么在MySQL中利用DB实现分布式锁

本文链接: https://lsjlt.com/news/55831.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么在MySQL中利用DB实现分布式锁
    怎么在MySQL中利用DB实现分布式锁?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。表设计首先要明确DB在系统中仍然需要认为是最脆弱的一环,因...
    99+
    2024-04-02
  • Redis中怎么利用Redlock实现分布式锁
    Redis中怎么利用Redlock实现分布式锁,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。普通实现说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道se...
    99+
    2023-06-20
  • java中怎么利用mongodb实现分布式锁
    今天就跟大家聊聊有关java中怎么利用mongodb实现分布式锁,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。原理 通过线程安全findAndModify 实现锁实现 定义...
    99+
    2023-06-20
  • mysql中怎么实现分布式锁
    这篇文章主要介绍“mysql中怎么实现分布式锁”,在日常操作中,相信很多人在mysql中怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql中怎么实现分布式锁”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-27
  • Spring Boot中怎么利用Redis实现分布式锁
    Spring Boot中怎么利用Redis实现分布式锁,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。分布式锁介绍Spring Boot 实现 Redis 分布式锁在 sprin...
    99+
    2023-06-16
  • PHP中利用Redis实现分布式锁
    随着互联网的快速发展,网站访问量的急剧增加,分布式系统的重要性也逐渐凸显出来。在分布式系统中,不可避免地涉及到并发同步以及数据一致性的问题。而分布式锁,作为一种解决并发同步问题的手段,也逐渐被广泛应用于分布式系统中。在PHP中,可以利用Re...
    99+
    2023-05-15
    PHP redis 分布式锁
  • 怎么在springcloud分布式系统中实现分布式锁
    本篇内容介绍了“怎么在springcloud分布式系统中实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简介一般来说,对数据进...
    99+
    2023-06-25
  • 利用Python+Redis实现分布式锁
    利用Python+Redis实现分布式锁 欢迎一起交流技术:一个人可以走的很快,但是一群人却可以走的更远。 常见关系型数据库(Oracle+MySQL+PG+GP)+高可用企业解...
    99+
    2024-04-02
  • MySQL实现分布式锁
    目录基于MySQL分布式锁实现原理及代码MySQL锁InnoDB共享锁排它锁MyISAM表共享读锁表独占写锁分布式锁实现难点:为什么需要for(;总结基于MySQL分布式锁实现原理及...
    99+
    2022-11-13
    MySQL实现分布式锁 MySQL分布式锁
  • 利用consul在spring boot中实现分布式锁场景分析
    因为在项目实际过程中所采用的是微服务架构,考虑到承载量基本每个相同业务的服务都是多节点部署,所以针对某些资源的访问就不得不用到用到分布式锁了。 这里列举一个最简单的场景,假如有一个智...
    99+
    2024-04-02
  • 怎么在Java中使用redis实现分布式锁
    本篇文章给大家分享的是有关怎么在Java中使用redis实现分布式锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。原理剖析上述三种分布式锁都是通过各自为依据对各个请求进行上锁,...
    99+
    2023-06-15
  • 怎么在SpringBoot中使用Redis实现分布式锁
    这篇文章主要介绍了怎么在SpringBoot中使用Redis实现分布式锁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么在SpringBoot中使用Redis实现分布式锁文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • 怎么在MySQL数据库中实现一个分布式锁
    这篇文章将为大家详细讲解有关怎么在MySQL数据库中实现一个分布式锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。建表CREATE TABLE&n...
    99+
    2024-04-02
  • Redis中怎么实现分布式锁
    本篇内容介绍了“Redis中怎么实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么需要分布式...
    99+
    2024-04-02
  • 怎么用Redis实现分布式锁
    本文小编为大家详细介绍“怎么用Redis实现分布式锁”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Redis实现分布式锁”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单机...
    99+
    2024-04-02
  • Redisson中怎么实现Redis分布式锁
    Redisson中怎么实现Redis分布式锁,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Redis几种架构Redis发展到现在,几种常见的部署架构有:单机模式;主从模式;...
    99+
    2023-06-20
  • 分布式锁的原理及Redis怎么实现分布式锁
    这篇文章主要介绍“分布式锁的原理及Redis怎么实现分布式锁”,在日常操作中,相信很多人在分布式锁的原理及Redis怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2023-02-02
    redis
  • 如何在Redis中实现分布式锁
    在Redis中实现分布式锁可以通过以下方式: 使用SETNX命令:在Redis中可以使用SETNX命令(SET if Not e...
    99+
    2024-04-09
    Redis
  • Redis分布式锁怎么实现
    这篇文章给大家分享的是有关Redis分布式锁怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。分布式锁一般有三种实现方式:1、数据库乐观锁;2、基于Redis的分布式锁;3、...
    99+
    2024-04-02
  • Redis怎么实现分布式锁
    这篇文章主要介绍“Redis怎么实现分布式锁”,在日常操作中,相信很多人在Redis怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis怎么实现分布式锁”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作