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

MySQL 锁机制深度剖析:全局锁、表锁与行锁

在高并发系统中,合理的锁策略是保障数据正确性与性能平衡的关键。MySQL 提供了多种锁机制——全局锁(Global Lock)表锁(Table Lock)行锁(Row Lock),每种锁都适用于不同的场景。本文将带你从原理、应用场景、示例操作和优劣比较四个维度,全面解读这三种锁。


一、全局锁(Global Lock)

image

1. 原理与作用

  • 作用域:锁定整个 MySQL 实例,阻塞所有写操作,读操作仍然被允许
  • 典型场景:逻辑备份(如 mysqldump),防止备份过程中数据发生变更

2. 获取/释放全局锁

-- 获取全局只读锁,所有写操作被阻塞
FLUSH TABLES WITH READ LOCK;-- 释放全局锁
UNLOCK TABLES;

注意:一旦执行全局锁,所有 schema 下的表都进入只读,慎用于线上高并发环境!


二、表锁(Table Lock)

image

1. 原理与分类

  • 作用域:锁定单张表

  • MyISAM 引擎:默认使用表锁;InnoDB 在显式 LOCK TABLES 时可使用表锁

  • 锁类型

    • 读锁 (READ LOCK):允许多个会话并发读,阻塞写
    • 写锁 (WRITE LOCK):独占锁,阻塞所有其他读写

2. 示例

-- 加读锁,其他会话只能读不能写
LOCK TABLES orders READ;-- 加写锁,当前会话独占写权限
LOCK TABLES orders WRITE;-- 操作完成后释放锁
UNLOCK TABLES;

3. 优劣势

优势劣势
实现简单、无死锁风险锁粒度较大,高并发写时性能严重受限

三、行锁(Row Lock)

image

1. 原理与特点

  • 作用域:只锁定被访问的行

  • 引擎:仅 InnoDB 支持,基于 多版本并发控制(MVCC)

  • 锁类型

    • 排他锁(X-lock):写操作时对行加锁,阻塞其他读写
    • 共享锁(S‑lock):读操作时对行加锁,允许并发读

2. 自动与显式行锁

  • 隐式行锁:比如 UPDATE ... WHERE id = ? 会自动加 X-lock
  • 显式行锁:使用 SELECT ... FOR UPDATE / LOCK IN SHARE MODE
BEGIN;
-- 对符合条件行加 X-lock
SELECT * FROM user WHERE id = 42 FOR UPDATE;-- 对符合条件行加 S-lock
SELECT * FROM user WHERE status = 'active' LOCK IN SHARE MODE;COMMIT;  -- 事务提交后自动释放行锁

3. 优劣势

优势劣势
锁粒度最小,支持高并发读写可能出现死锁,需要谨慎设计事务和访问顺序

四、三种锁的对比与选型建议

特性全局锁表锁行锁
锁粒度整个实例整张表单条记录
并发能力最差一般最佳
死锁风险存在
典型引擎MyISAM/InnoDBMyISAM/InnoDBInnoDB
使用场景备份、维护批量写、快速备份日常 OLTP、高并发场景

选型建议:

  1. 首选行锁:默认 InnoDB 引擎已对 DML 操作加行锁,适合绝大多数在线业务。
  2. 表锁限特殊场景:当需要对整表快速批量处理时,可显式使用表锁。
  3. 全局锁谨慎用:仅在备份或全库维护时短暂加锁,避免阻塞生产写流量。

五、监控与诊断

  • 查看当前 InnoDB 锁等待与死锁信息:

    -- 查看锁等待详情
    SELECT * FROM information_schema.INNODB_LOCKS;-- 查看锁等待队列以及死锁
    SHOW ENGINE INNODB STATUS\G
    
  • 使用 performance_schema 进一步分析锁争用热点,提升定位精度。


六、实战小贴士

  1. 短事务:保持事务尽可能短,减少持锁时间。
  2. 固定访问顺序:多表事务中,按相同顺序操作,降低死锁几率。
  3. 合理索引:行锁基于索引扫描,加好索引可避免全表锁或间隙锁。
  4. 监控预警:结合监控平台,对锁等待、长事务进行告警。

▶️ 关注我,带你持续深挖数据库性能与架构优化秘密!


文章转载自:
http://breastbone.dmyyro.cn
http://bimana.dmyyro.cn
http://azus.dmyyro.cn
http://cervical.dmyyro.cn
http://acrolein.dmyyro.cn
http://applique.dmyyro.cn
http://bulkhead.dmyyro.cn
http://anagogic.dmyyro.cn
http://chinfest.dmyyro.cn
http://bouzoukia.dmyyro.cn
http://anta.dmyyro.cn
http://blastomycetes.dmyyro.cn
http://cadastration.dmyyro.cn
http://bolingbroke.dmyyro.cn
http://basophilic.dmyyro.cn
http://celom.dmyyro.cn
http://amebocyte.dmyyro.cn
http://antitrinitarian.dmyyro.cn
http://chowry.dmyyro.cn
http://arnold.dmyyro.cn
http://anglewing.dmyyro.cn
http://agued.dmyyro.cn
http://buskined.dmyyro.cn
http://astrolatry.dmyyro.cn
http://arsenate.dmyyro.cn
http://brought.dmyyro.cn
http://cast.dmyyro.cn
http://algol.dmyyro.cn
http://angular.dmyyro.cn
http://angelus.dmyyro.cn
http://www.dtcms.com/a/200905.html

相关文章:

  • 如何从容应对面试?
  • 大模型小课堂开课啦!!!
  • yolo模型优化【上下文标注】
  • HJ3 明明的随机数【牛客网】
  • 常见提示词攻击方法和防御手段——提示词越狱
  • 同一颗太阳:Australia、Austria、Arab、Africa、Augustus、August、Aurora、Athena
  • LeetCode 1306. 跳跃游戏 III(中等)
  • 网络-MOXA设备基本操作
  • Python测试单例模式
  • ubuntu系统 | dify+ollama+deepseek搭建本地应用
  • gcc: attribute: packed
  • FEKO许可证与多用户共享
  • day 21 常见降维算法
  • CPP之动态内存管理以及模板初阶
  • 第三十九节:视频处理-光流法 (Lucas-Kanade, Dense)
  • 计算机存储与数据单位的核心定义及换算逻辑
  • 深度解析 MCP:重新定义 API 的开发范式
  • CSS attr() 函数详解
  • Srinath多元假设检验 (Multiple-hypothesis Testing)(To 廖老师)
  • SpringBoot(二)--- SpringBoot基础(http协议、分层解耦)
  • flask蓝图的导入与注册
  • 宇宙漂流的时间胶囊:我用 CodeBuddy 实现了一个「太空感」单页应用
  • 【C语言内存函数】--memcpy和memmove的使用和模拟实现,memset函数的使用,memcmp函数的使用
  • java笔记07
  • SAP系统的委外业务是什么?委外采购(标准委外)与工序外协的区别有哪些?
  • leetcode hot100刷题日记——3.移动零
  • 【Nginx学习笔记】:Fastapi服务部署单机Nginx配置说明
  • laravel 通过Validator::make验证后,如何拿到验证后的值
  • Kali安装配置JAVA环境和切换JDK版本的最详细的过程
  • 自己拥有一台服务器可以做哪些事情