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

【MYSQL】GET_LOCK使用方法简单解析

背景描述: 在同一进程中,如果开了多个线程操作同一数据,为保证数据准确性,我们可以使用lock来保证互斥,但是如果是多个进程操作同一数据,lock就不行了,此时我们可以使用 基于MYSQL实现的分布式锁来实现。

SELECT GET_LOCK(@lockName, @timeout); //lockName==锁,timeout==等待时间,如果超时,不再等待

简单来说,就是多个进程去修改数据库的某一个数据(操作同一数据库),此时数据库为了保证准确性,会加一个锁,确保一次只能一个进程的一个线程去访问,其他访问的需要等待,直到持有这个锁。
GET_LOCK实现逻辑(简化版):
(1)MySQL 5.7 以及更早版本中一个连接(代码中构建和数据库的连接)只能持有一个命名锁,如果再次GET_LOCK(‘xxx’, …),会 自动释放之前的锁,再尝试获取新的锁。之后版本可以管理多个锁。
(2)当在代码中调用SELECT GET_LOCK(@lockName, @timeout); 时,mysql首先会查询当前全局锁表(hash结构)里是否有这个lockname
(3)如果没有,立即插入并记录当前连接信息,返回1。
(4)如果有,当前连接进入等待队列(内部用条件变量 COND_WAIT 实现)。
(5)如果在 timeout 秒内锁被释放 → 插入自己,返回 1。
(6)如果超时还没等到 → 返回 0(注意:此时锁依然在别人手上,不会自动释放)。
(7)异常情况:如果连接断开/SQL 出错 → 返回 NULL;如果等待过程中当前 session 被 kill → 直接中断,返回 NULL。
mysql查看数据库版本:

SHOW VARIABLES LIKE 'version';

代码示例:

using System;
using MySql.Data.MySqlClient;
using System.Threading;class Program
{static void Main(){string connStr = "Server=localhost;Database=test;User ID=root;Password=123456;";using (var conn = new MySqlConnection(connStr)){conn.Open();string lockName = "MyApp_DistributedLock";// 1. 尝试获取锁(等待超时 10 秒)using (var cmd = new MySqlCommand("SELECT GET_LOCK(@lockName, @timeout);", conn)){cmd.Parameters.AddWithValue("@lockName", lockName);cmd.Parameters.AddWithValue("@timeout", 10);var result = Convert.ToInt32(cmd.ExecuteScalar());if (result == 1){Console.WriteLine("✅ 获取到锁,可以安全执行任务");try{// 模拟需要保护的临界区操作Thread.Sleep(5000);}finally{// 2. 释放锁using (var releaseCmd = new MySqlCommand("SELECT RELEASE_LOCK(@lockName);", conn)){releaseCmd.Parameters.AddWithValue("@lockName", lockName);var releaseResult = Convert.ToInt32(releaseCmd.ExecuteScalar());Console.WriteLine(releaseResult == 1 ? "🔓 锁已释放" : "⚠️ 锁释放失败");}}}else{Console.WriteLine("❌ 未能获取到锁(可能被其他进程占用)");}}}}
}
http://www.dtcms.com/a/358700.html

相关文章:

  • C++_静态多态、运行多态和模板多态
  • 下一代 AI 交互革命:自然语言对话之外,“意念控制” 离商用还有多远?
  • AWD相关知识
  • Scikit-learn Python机器学习 - 数据集介绍
  • 矿物类型分类实战:从数据预处理到多模型对比
  • 幻觉与模仿:深入剖析当前大语言模型为何未能跨越“理解”与“推理”的鸿沟
  • TuringComplete游戏攻略(2.1算数运算)
  • 基础的汇编指令
  • 如何快速了解项目管理基础
  • 【机器学习入门】4.1 聚类简介——从“物以类聚”看懂无监督分组的核心逻辑
  • destoon8.0使用post插入keyword热搜到表
  • 深入理解shared_ptr与循环引用问题
  • 超越传统SEO:用生成引擎优化(GEO)驱动下一轮增长
  • 【蓝桥杯 2024 省 Python B】缴纳过路费
  • Markdown 文件编辑基础教程
  • 基于YOLO8的垃圾识别检测系统(数据集+源码+文章)
  • 【开题答辩全过程】以 线上游戏商城为例,包含答辩的问题和答案
  • Java学习day_14之API(正则表达式)
  • 【LeetCode】大厂面试算法真题回忆(121) —— 经典屏保
  • 嵌入式Linux驱动开发:蜂鸣器驱动
  • 图解LLM(AI大模型)的工作原理
  • SRE命令行兵器谱之二:lsof - 解密“端口被占用”与“文件句柄泄漏”的终极侦探
  • 吴恩达机器学习作业九:kmeans聚类
  • php电子签名
  • 2025年09月计算机二级MySQL选择题每日一练——第十二期
  • Rust 登堂 之 Sized和不定长类型 DST(七)
  • LabVIEW 时间字符串处理与显示
  • 继电器的作用、选型和测量-超简单解读
  • 算法题(195):点名
  • 【学Python自动化】 2. Windows Python 解释器使用笔记