只用Mysql搞一个分布式锁

这篇具有很好参考价值的文章主要介绍了只用Mysql搞一个分布式锁。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在web开发中,分布式的锁的应用场景甚多,我们可以通过分布式锁来进行一些仅依赖于数据库的事务很难直接保证原子性的操作,比如多种不同数据源的访问,网络通信等等。多数情况下我们会使用memcache的add, redis中在set中指定nx参数等来完成。

下面介绍一个仅依赖Mysql来完成分布式锁的方式,如果项目比较小且主要使用的数据库是Mysql,那么就不需要引入额外的架构上的依赖了。

这里的方法就是通过Mysql的GET_LOCK函数和RELEASE_LOCK函数来完成的。我们可以通过GET_LOCK(lock_key, timeout)函数来创建一个key:

SELECT GET_LOCK('user_id_XXXX', 10)

除了获取到lock_key的进程,其他进程就无法进入被这个锁锁住的代码逻辑了。之后,在同一个db session中,可以再通过RELEASE_LOCK(lock_key)来释放这个lock_key:

SELECT RELEASE_LOCK('user_id_XXXX')

被释放的lock_key就可以被别的进程获取了。

我写了一个python的例子,可以看一下

class DbLock(object):
    def __init__(self, key, connection, timeout=5):
        '''
        key: lock key.
        connection: a db connection object.
        '''
        self.key = key
        self.connection = connection
        self.timeout = timeout
        self.cursor = None

    def __enter__(self):
        self.cursor = self.connection.cursor()
        self.cursor.execute("SELECT GET_LOCK(%s, %s)",
                            [self.key, self.timeout])
        result, = self.cursor.fetchone()
        if result != 1:
            raise Exception("DbLock %s error, timeout %s, returned %s."\
                            % (self.key, self.timeout, result))

    def __exit__(self, exc_type, exc_value, traceback):
        self.cursor.execute("SELECT RELEASE_LOCK(%s)",
                            [self.key])
        self.cursor.close()
        if exc_type is not None:
            pass
            # deal with error

这样在实际的代码中,就可以通过如下方式来使用这个lock了(我们假设是django的数据库connection对象):文章来源地址https://www.toymoban.com/news/detail-813331.html

from django.db import connection

with DbLock(key, connection, 5):
    # your own code

到了这里,关于只用Mysql搞一个分布式锁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式锁之mysql实现

    5000个请求测试买票,查看是否出现超卖问题 出现了超卖问题 或者使用ReentrantLock jmeter压测结果显示,5000总票数,压测5000,都能够解决超卖的现象   查库操作,演示超卖现象 5000总票数,压测5000,压测结果,显示超卖  加锁,本地锁解决超卖现象 5000总票数,压测5000,压测

    2024年02月11日
    浏览(25)
  • 如何使用mysql实现分布式锁

    目录 什么是分布式锁? 如何实现分布式锁? 定义分布式表结构 定义锁统一接口 使用mysql来实现分布式锁 ① 生成线程标记ID ② 加锁 ③ 解锁 ④ 重置锁 写在最后 1. 什么是分布式锁? 百度百科:分布式锁是控制分布式系统之间同步访问共享资源的一种方式。 ㅤ如引用所述,

    2024年02月05日
    浏览(31)
  • 分布式锁实现(mysql,以及redis)以及分布式的概念(续)redsync包使用

    这张尽量结合上一章进行使用:上一章 这章主要是讲如何通过 redis 实现分布式锁的 这里我用 redis 去实现: 技术: golang , redis , 数据结构 这里是有一个大体的实现思路:主要是使用 redis 中这些语法 redis 命令说明: setnx 命令: set if not exists ,当且仅当 key 不存在时,将 ke

    2024年01月22日
    浏览(52)
  • 分别使用Redis、MySQL、ZooKeeper构建分布式锁

    本文使用Java构建三种中间件的分布式锁,下面介绍下三种分布式锁的优缺点, 使用MySQL构建分布式锁 ,因为数据库数据存储在磁盘中,所以IO速率相对较慢,因此构建出来的分布式锁不适合用在高并发场景,对于一些对并发要求不高的系统中可以使用,进一步提高系统的安全

    2024年02月06日
    浏览(34)
  • ​【五一创作】基于mysql关系型实现分布式锁

    看完该文预计用时:15分钟 看之前应具体的技术栈:springboot mysql nginx(了解即可) 目录 0.写在前面 1. 从减库存聊起 1.1. 环境准备   1.2. 简单实现减库存  1.3. 演示超卖现象 1.4. jvm锁问题演示  1.4.2. 原理 1.5. 多服务问题  1.5.1. 安装配置nginx 1.5.2. 压力测试  1.6. mysql锁演示 1

    2024年02月05日
    浏览(31)
  • MySQL 按日期流水号 条码 分布式流水号

    有这样一个场景,有多台终端,要获取唯一的流水号,流水号格式是 日期+0001形式,使用MySQL的存储过程+全局锁实现这个需求。 以下是代码示例。 注:所有的终端连接到MySQL服务器获取流水号,如果获取到的是 “-1”,需要重新获取。

    2024年02月02日
    浏览(31)
  • MySQL、Redis 和 Zookeeper 实现分布式锁方法及优缺点

    MySQL、Redis 和 Zookeeper 都可以用来实现分布式锁,每种技术都有其特定的实现方法以及各自的优缺点。 MySQL 分布式锁 实现方法 在 MySQL 中实现分布式锁通常涉及到使用数据库表。可以创建一个专用的锁表,并利用行的唯一性(例如利用唯一索引)来实现锁机制。 使用基于事务

    2024年04月11日
    浏览(31)
  • 分布式 SpringCloudAlibaba、Feign与RabbitMQ实现MySQL到ES数据同步

    本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 同步调用 方案一:同步调用 基本步骤如下: hotel-demo对外提供接口,用来修改elasticsearch中的数据 酒店管理服务在完成数据库操

    2024年04月11日
    浏览(36)
  • k8s mysql集群 & 分布式锁 & apiserver & etcd 的关系

    在 Kubernetes (k8s) 中,MySQL 集群可以使用分布式锁来确保在多个实例之间对共享资源的互斥访问。这是通过结合 Kubernetes API Server 和 etcd 来实现的。 Kubernetes API Server 是 k8s 集群中的核心组件之一,它充当了集群的控制平面,提供了对集群资源的管理和操作接口。API Server 是一个

    2024年02月07日
    浏览(39)
  • 第100讲:MHA+Atlas实现MySQL主从复制读写分离分布式集群

    Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。 Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来

    2024年02月21日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包