MySQL 锁机制详解

Mysql高级篇(中)——锁机制 本篇博文主要介绍了MySQL中锁的相关概念、工作原理、各自的优缺点、使用场景、注意事项及锁监控策略,让大家对MySQL中的锁有更清晰的认识 阅读详情

MySQL 锁机制详解

1. 表级锁(Table-Level Locks)
  • 粒度:整张表。
  • 使用场景:
    • DDL操作:如 ALTER TABLE、DROP TABLE 等结构变更。
    • 全表扫描:未使用索引的查询(如 SELECT * FROM table WHERE non_index_column=1)。
  • 特点:
    • 锁冲突率高:同一时间只允许一个事务操作表。
    • 并发性能差:MyISAM 引擎默认使用表级锁。
    • 显式加锁语法:
      LOCK TABLES table_name READ;  -- 加共享锁(允许其他事务读,阻塞写)
      LOCK TABLES table_name WRITE; -- 加排他锁(阻塞其他事务读写)
      UNLOCK TABLES;               -- 释放锁
      
2. 行级锁(Row-Level Locks)
  • 粒度:单行记录。
  • 使用场景:
    • 高并发写操作:如 UPDATE、DELETE 带索引条件的语句。
    • 精确控制:仅锁定需要修改的行,减少锁冲突。
  • 特点:
    • 锁冲突率低:InnoDB 引擎默认支持行级锁。
    • 依赖索引实现:若未使用索引,退化为表级锁。
    • 显式加锁语法:
      SELECT * FROM table WHERE id=1 FOR UPDATE;    -- 加排他锁(X锁)
      SELECT * FROM table WHERE id=1 LOCK IN SHARE MODE; -- 加共享锁(S锁)
      
3. 共享锁(Shared Lock, S Lock)
  • 粒度:行或表。
  • 使用场景:
    • 读操作需阻塞写:如事务A读取数据时,事务B不能修改。
    • 显式加锁示例:
      BEGIN;
      SELECT * FROM orders WHERE user_id=100 LOCK IN SHARE MODE; -- 加S锁
      -- 其他事务可读,但无法修改 user_id=100 的行
      COMMIT;
      
  • 特点:
    • 允许多事务并发读:不阻塞其他 S 锁。
    • 阻塞 X 锁:其他事务无法加 X 锁修改数据。
4. 排他锁(Exclusive Lock, X Lock)
  • 粒度:行或表。
  • 使用场景:
    • 写操作需独占数据:如事务A修改数据时,禁止其他事务读写。
    • 显式加锁示例:
      BEGIN;
      SELECT * FROM products WHERE id=5 FOR UPDATE; -- 加X锁
      UPDATE products SET stock=stock-1 WHERE id=5;  -- 其他事务无法读写此行
      COMMIT;
      
  • 特点:
    • 完全独占:阻塞其他事务的 S 锁和 X 锁。
    • 自动加锁:DML 语句(如 UPDATE、DELETE)隐式加 X 锁。
5. 意向锁(Intention Locks)
  • 粒度:表级锁。
  • 使用场景:
    • 辅助快速判断表是否被锁定:避免逐行检查锁冲突。
  • 类型:
    • 意向共享锁(IS):事务打算在表中某些行加 S 锁。
    • 意向排他锁(IX):事务打算在表中某些行加 X 锁。
  • 兼容性:
    当前锁ISIXSX
    IS✅✅✅❌
    IX✅✅❌❌
    S✅❌✅❌
    X❌❌❌❌
6. 间隙锁(Gap Lock)
  • 粒度:索引记录的间隙(区间)。
  • 使用场景:
    • 防止幻读:在 RR 隔离级别下,锁定索引范围(如 WHERE id > 10)。
    • 示例:
      -- 表中存在 id=5, 10, 15 的记录
      BEGIN;
      SELECT * FROM users WHERE id BETWEEN 10 AND 20 FOR UPDATE; -- 锁定 (10,15) 和 (15,20) 的间隙
      -- 其他事务无法插入 id=12 或 id=18 的新记录
      COMMIT;
      
  • 特点:
    • 仅 RR 隔离级别生效:RC 级别无间隙锁。
    • 锁定“不存在”的数据:防止范围内插入新记录。
7. 临键锁(Next-Key Lock)
  • 粒度:行锁 + 间隙锁(左开右闭区间)。
  • 使用场景:
    • 默认 RR 隔离级别的锁机制:结合行锁和间隙锁避免幻读。
    • 示例:
      -- 表中存在 id=5, 10, 15 的记录
      BEGIN;
      SELECT * FROM users WHERE id > 10 FOR UPDATE; -- 锁定 (10,15], (15,+∞)
      -- 其他事务无法插入 id=12(落在 (10,15])或 id=20(落在 (15,+∞))
      COMMIT;
      
  • 特点:
    • 锁区间示例:假设当前有记录 id=10,临键锁范围为 (-∞,10]。
    • 解决幻读:通过锁定可能插入新记录的区间。

锁机制对比总结

锁类型粒度加锁场景阻塞操作隔离级别依赖
表级锁整张表DDL、全表扫描阻塞其他所有表操作所有级别
行级锁(X/S)单行记录带索引的 DML 操作阻塞同一行的写(S锁)或读写(X锁)所有级别
间隙锁索引间隙RR 级别下的范围查询阻塞区间内的插入仅 RR
临键锁行+间隙RR 级别下的默认锁机制阻塞区间内的插入和修改仅 RR

实际应用示例

场景:防止超卖(行锁 + 临键锁)
-- 事务A(用户下单,购买商品id=100)
BEGIN;
SELECT stock FROM products WHERE id=100 FOR UPDATE; -- 加X锁(行锁)
IF stock > 0 THEN
    UPDATE products SET stock=stock-1 WHERE id=100;
COMMIT;
ELSE
    ROLLBACK;
END IF;

-- 事务B(同时尝试购买同一商品)
-- 会被阻塞,直到事务A提交或回滚。
死锁案例与解决
-- 事务1
BEGIN;
UPDATE accounts SET balance=balance-100 WHERE id=1; -- 锁住id=1
UPDATE accounts SET balance=balance+100 WHERE id=2; -- 尝试锁id=2

-- 事务2(同时运行)
BEGIN;
UPDATE accounts SET balance=balance-200 WHERE id=2; -- 锁住id=2
UPDATE accounts SET balance=balance+200 WHERE id=1; -- 尝试锁id=1

-- 死锁发生!InnoDB 自动回滚其中一个事务。

解决方案:按固定顺序访问资源(如先更新id较小的账户)。


总结

  • 表级锁:简单但低并发,适合结构变更或全表操作。
  • 行级锁:高并发场景首选,需结合索引使用。
  • 意向锁:优化表锁冲突检测效率。
  • 间隙锁/临键锁:RR 隔离级别下防止幻读的核心机制。

建议:

  • 尽量使用索引缩小锁范围。
  • 避免长事务,减少锁持有时间。
  • 在 RR 级别下,注意间隙锁可能导致的锁竞争问题。
【MySQL】如何理解MySQL的锁(图文并茂,一网打尽) 这里博主整理我们常见的MySQL中锁的概念,还介绍了面试中 常问的关于乐观锁、悲观锁的 一些特点。后续还有更多内容与大家分享~ 阅读详情

相关推荐

mysql的锁机制详解

*锁是计算机协调多个进程或线程并发访问某一资源的机制。**在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。相对其他数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的锁机制。

yonggeit的博客 3171

MySQL锁机制详解

会话192.168.11.101(1)”给表locktab加了锁,其他会话的操作:1、可以对其他表(表locktab以外的表)进行读、写操作。2、对表locktab:读操作可以,写操作需要等待释放锁。

qq_43842093的博客 4476

mysql 锁机制与原理详解

mysql 锁原理详解

congge 8937

MySQL中的锁机制详解

事务的(隔离级别)是由锁来保证的。并发访问数据的情况分为:1.读-读即并发事务相继读取相同的记录,因为没涉及到数据的更改,所以不会有并发安全问题,允许这种情况发生。2.写-写即并发事务对相同记录进行修改,会出现问题,因为任何一种隔离级别都不允许发生脏写,所以多个未提交的事务对同一个记录修改时需要加锁,保证它们是顺序执行的。锁内存中的结构,当事务想对某条数据进行更改时,首先会查看该记录有没有与之关联的锁结构,有的话则等待它的事务被提交,锁被释放;反之没有锁则生成锁结构与该记录继续关联。......

清风 5604

当vCenter的证书过期、Root密码过期、Root密码遗忘同时发生时的解决方法与步骤

vCenter,强制修改root密码,修改SSO User密码,修复证书过期问题

OCTSJimmy的专栏 5546

Ubuntu视频播放器怎么选?VLC、mpv、SMPlayer硬解与字幕配置指南

在Linux系统中,视频播放体验取决于播放器、解码器与显卡驱动的协同。硬件解码通过VA-API或VDPAU将解码任务交给GPU,能显著降低CPU占用,解决4K高码率视频卡顿问题。对于Ubuntu用户,合理配置解码环境与播放器,可流畅播放HEVC、多音轨及ASS特效字幕视频。无论是日常观影、番剧追更还是家庭影院场景,选择合适的播放器并正确启用硬解,都是提升体验的关键。本文围绕Ubuntu平台,详解VLC、mpv、SMPlayer等播放器的安装、硬解配置与常见问题排查,帮助你在Linux上获得流畅的本地视频播放

weixin_33801856的博客 506

【数据库】MySQL 中的锁机制

数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。MySQL 数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。...

Data · Model · Agent · Repeat 1万+

Trans论文复现:电池储能调峰和调频:超线性增益的联合优化程序代码!

本程序参考一区SCI期刊《Using Battery Storage for Peak Shaving and Frequency Regulation: Joint Optimization for Superlinear Gains》,程序。与之前将电池储能用于单一应用相比,研究结果表明,如果电池联合提供多种服务,它们可以获得比以前想象的更大的经济效益。欢迎感兴趣的小伙伴关注下方公众号获取完整版代码哦~,小编会继续推送更有质量的学习资料、文章程序代码~限于篇幅,仅列出部分算例的结果!

weixin_48747334的博客 567

MySql锁机制详解

MySql锁机制

Ives_WangShen的博客 578

2022-04-06 RK3566 上调试百兆以太网卡YT8512C 调试记录

一、原理图 二、dts &gmac1_clkin{ clock-frequency = <50000000>; status = "okay"; }; &gmac1 { phy-mode = "rmii"; clock_in_out = "input"; snps,reset-gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>; snps,reset-active-low; sn...

海月汐辰 1万+

图解B树的原理及操作

本文主要参考:https://blog.youkuaiyun.com/shenchaohao12321/article/details/83243314 1. B树 1.1 B树的定义 B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。 一颗m阶的B树定义如下: 1)每个结点最多有m-1个关键字。 2)根结点最少可以只有1个关键字。 3)非根结点至少有Math.ceil(m/2)-

jinking01的专栏 3万+

mysql锁机制详解

今天面试官问了SQL的锁机制。因为本人只有1年的工作经验,且大部分时间都是在增删改查,所以无法回答,完了后,自己特地看了下。  所以本文打算总结一下mysql的锁机制。 本文主要论述关于mysql锁机制,mysql版本为5.7,引擎为innodb,由于实际中关于innodb锁相关的知识及加锁方式很多,所以没有那么多精力罗列所有场景下的加锁过程并加以分析,仅根据现在了解的知识,结合官方文档,说说自己...

daniujava的博客 213

西门子 标准程序解读---> 机器手抓取和涂胶控制程序

摘要 该程序实现机械手在OP70/OP90工位的自动化控制,核心功能包括: 流程控制:分段(Seg1-Seg11)管理抓件、涂胶、放件等动作,结合DB1050/DB1250数据块监控工位状态及变位机位置反馈。 安全机制:配置干涉区(FC124)、实时检测安全光/急停信号,防止碰撞;服务程序(FB191)支持维修位触发与安全隔离。 参数配置:通过DB块关联机器人速度、节拍(FB27)、车型编码(如空过=2)及手自动模式(DB70.DBX21.2)。 应用场景:适用于汽车焊接/装配线

工控智联驿站 1238

关于mysql锁机制详解

锁概述   MySQL的锁机制,就是数据库为了保证数据的一致性而设计的面对并发场景的一种规则。   最显著的特点是不同的存储引擎支持不同的锁机制,InnoDB支持行锁和表锁,MyISAM支持表锁。   表锁就是把整张表锁起来,特点是加锁快,开销小,不会出现死锁,锁粒度大,发生锁冲突的概率高,并发相对较低。   行锁就是以行为单位把数据锁起来,特点是加锁慢,开销大,会出现死锁,锁粒度小,发生锁冲突的概率低,并发度也相对表锁较高。 MyISAM锁 MyISAM的锁调度   在MyISAM引擎中,读锁

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 377

【数据集】基于ubESTARFM法的100m 地温LST数据集(澳大利亚)

【数据集】基于ubESTARFM法的100m 地温LST数据集(澳大利亚)

WW、forever的博客 265

基于YOLOv5的空间目标智能监测系统:航天器与太空碎片识别技术实现

做完这个项目,你会发现自己完整走过了“数据采集→标注→模型训练→功能集成→界面开发”的毕设全流程,这不仅是技术能力的证明,更是对“技术守护宇宙安全”这一理念的实践。答辩时,你可以重点讲这几点:系统解决了航天监测的哪些痛点、YOLOv5在太空目标检测中的性能优势、系统未来能怎么优化(比如对接航天监测网络、实现实时轨道预测)。未来,这个系统还能往“更智能”的方向发展:比如结合轨道计算预测碰撞风险、开发移动端APP让天文爱好者参与太空垃圾上报、在航天任务中实现全自动避障决策……想象空间很大。

m0_64661770的博客 109

Mysql 锁机制详解

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL

Byron's notebook 771

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Mysql锁机制详解

Mysql锁: 在多线程当中如果想保证数据的准确性是如何实现的呢?没错,通过同步实现。同步就相当于是加锁。加了锁以后有什么好处呢?当一个线程真正在操作数据的时候,其他线程只能等待。当一个线程执行完毕后,释放锁。其他线程才能进行操作! 那么我们的MySQL数据库中的锁的功能也是类似的,处理事务的隔离性中,可能会出现脏读、不可重复读、幻读的问题,所以,锁的作用也可以解决这些问题! 在数据库中,数据是一种供许多用户共享访问的资源,如何保证数据并发访问的一致性、有效性,是所有数据库必须解决的一个问题,

itzhuzhu的博客 1542

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

关于MySQL的锁机制详解

锁概述   MySQL的锁机制,就是数据库为了保证数据的一致性而设计的面对并发场景的一种规则。   最显著的特点是不同的存储引擎支持不同的锁机制,InnoDB支持行锁和表锁,MyISAM支持表锁。   表锁就是把整张表锁起来,特点是加锁快,开销小,不会出现死锁,锁粒度大,发生锁冲突的概率高,并发相对较低。   行锁就是以行为单位把数据锁起来,特点是加锁慢,开销大,会出现死锁,锁粒度小,发生锁...

u011252402的专栏 267

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 接口和抽象类的区别
下一篇: JVM:组成、垃圾回收器、垃圾回收算法、常见命令
java烤冷面
博客等级 码龄4年 177粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值