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

【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.xdnf.cn/news/19229.html

相关文章:

  • 直线与椭圆相交弦长计算公式
  • 【物联网】BLE Fundamentals 核心概念总结-广告-读写特征-LED控制-传感器通知-上下游通信过程
  • hashmap计算key的hash的时候为什么要右移16位
  • [光学原理与应用-329]:ZEMAX - 主要用途与主要功能
  • 复现 RoboDK 机械臂几何校准(Staubli TX2‑90L / TX200)
  • Redis(自写)
  • MySQL 简介
  • RocketMQ源码详解(NameServer启动流程)
  • Altium Designer中电路板设计
  • 【ICO】快速制作ICON教材/使用icofx3快速制作ico
  • 生成对抗网络(GAN):深度学习领域的革命性突破
  • 深入解析HarmonyOS:UIAbility与Page的生命周期协同
  • var maxScore = Int.MinValue 详解
  • 最长递增子序列(LIS)的 DFS 解法详解与实现
  • 【69页PPT】智慧工厂数字化工厂蓝图规划建设方案(附下载方式)
  • 【计算机组成原理】LRU计数器问题
  • 项目管理的五个阶段是什么
  • 关于PXIe工控机的网速问题XH-PXIe7313万兆网卡
  • Java学习day_14之API(正则表达式)
  • 生成式BI工具(WrenAI)
  • rhel-server-7.9-x86_64-dvd.iso
  • AFSIM仿真工具介绍与源码编译
  • 【开题答辩全过程】以 靖西市旅游网站为例,包含答辩的问题和答案
  • [Oracle] LENGTH()函数
  • php电子签名
  • 【C++】掌握string类操作:高效处理字符串
  • 3D生成模型-NeRF:用神经辐射场定义视图合成
  • Ferris Wheel (贪心 | 双指针)
  • ubuntu 安装conda, ubuntu24安装miniConda
  • 【Pytorch】生成对抗网络实战