当前位置: 首页 > java >正文

(MySQL)分布式锁

在分布式系统中,多个进程可能会同时对同一资源进行操作,如果没有同步机制,就会造成数据不一致问题。为了避免这种情况,需要分布式锁。Redis 是常见的实现方式,但在某些场景下,我们也可以使用 MySQL 来实现分布式锁。


一、MySQL 实现分布式锁的方式

1. 基于 SELECT ... FOR UPDATE

  • 在数据库中设计一张锁表,例如 lock_table,其中包含 resource 字段表示锁的资源。

  • 当某个进程想要获取锁时,它执行一条带有事务的 select ... for update 语句,查询指定的 resource

  • 由于 for update 会对该行加行级排他锁,因此同一时间只有一个事务能够获取成功。

  • 业务执行完后,提交事务,释放锁。

这种方式依赖 事务 + 行锁,实现简单,但如果事务未提交,锁就会一直被持有,可能导致阻塞。


2. 基于唯一索引插入

  • 在数据库中建立一张锁表,resource 字段设置为唯一索引。

  • 当进程尝试获取锁时,插入一条 resource = xxx 的记录:

    • 如果插入成功,说明锁获取成功。

    • 如果插入失败(因为唯一约束冲突),说明锁已被占用。

  • 释放锁时,删除对应的 resource 记录。

这种方式实现的是 非阻塞锁,适合对性能有一定要求的场景。


二、存在的问题

  1. 性能较低:相比 Redis 内存操作,MySQL 的锁实现基于磁盘/事务,效率偏低。

  2. 死锁风险:如果事务未提交或连接异常,可能导致锁长时间不释放。

  3. 可扩展性差:MySQL 适合小规模场景,一旦分布式规模扩大,性能瓶颈明显。


三、适用场景

  • 对一致性要求极高的场景,可以用 MySQL 锁来保证严格的事务隔离。

  • 数据规模和并发量不大,且业务已经高度依赖 MySQL 的情况下。


四、总结

MySQL 分布式锁的两种实现方式:

  1. 基于事务的 select ... for update(阻塞锁)

  2. 基于唯一索引插入(非阻塞锁)

虽然可以用 MySQL 实现分布式锁,但实际生产环境更多推荐 Redis 或 ZooKeeper,因为它们在 性能、可用性和可靠性 上更适合大规模分布式场景。

http://www.xdnf.cn/news/19651.html

相关文章:

  • k8s知识点汇总2
  • 【 HarmonyOS 】错误描述:The certificate has expired! 鸿蒙证书过期如何解决?
  • K8S-etcd数据库的相关操作
  • 吴恩达机器学习补充:决策树和随机森林
  • 中越跨境物流管理系统的设计与实现(原创)
  • DiffusionGPT-LLM驱动的文本生成图像系统
  • 【高等数学】第十章 重积分——第五节 含参变量的积分
  • 焦耳热技术助力顶刊研究:薄层质子交换膜实现高效水电解制氢
  • 【STM32】在链接脚本中指定DMA Buffer的地址
  • 智慧班牌系统基于Java+Vue技术栈构建,实现教育信息化综合管理。
  • shell脚本编辑(小白基础学习)
  • 从拿起简历(resume)重新找工作开始聊起
  • 【算法】算法题核心类别与通用解题思路
  • git基础命令
  • React中纯 localStorage 与 Context + useReducer + localStorage对比
  • HTML应用指南:利用GET请求获取MSN财经股价数据并可视化
  • IDEA Spring属性注解依赖注入的警告 Field injection is not recommended 异常解决方案
  • 【0426】insert into 内核实现之 找到 buffe, 插入 tuple (2)
  • YOLO 目标检测:YOLOv4数据增强、CIoU Loss、网络结构、CSP、SPPNet、FPN和PAN
  • 模型量化(Model Quantization) 和低精度计算(Low-Precision Computing)
  • 程序员与杀毒软件:一场不必要的“战争”?程序员用什么杀毒软件?-优雅草卓伊凡
  • pandas自学笔记16 pandas可视化
  • 2025年职场人士专业证书选择与分析
  • 免费GIS服务器方案:OGC标准3DTiles服务发布与跨平台渲染实践
  • word运行时错误‘53’,文件未找到:MathPage.WLL,更改加载项路径完美解决
  • 漏洞挖掘 渗透测试思路图总结
  • 洛谷 P1115 最大子段和
  • Onion-LO(已开源)——LIDAR里程计的统一框架
  • LeetCode 面试经典 150_滑动窗口_串联所有单词的子串(32_30_C++_困难)(滑动窗口:控制起点和滑动距离)
  • GPS:开启定位时代的科技魔杖