【MySQL】MySQL中锁有哪些?

一、按照粒度分类:

粒度越小,并发度越高,锁开销越大。

1.全局锁:

  • 作用: 锁定整个MySQL实例(所有数据库)。
  • 适用场景: 全库逻辑部分。(确保备份期间数据的一致性。)
  • 实现方式: 通过 FLUSH TABLES WITH READ LOCK (FTWRL) 命令实现,加锁后所有表变为只读 ,更新、删除、插入等操作会被阻塞。
  • 注意:InnoDB可通过 mysqldump --single-transaction 结合事务隔离级别避免使用全局锁(利用MVCC实现一致性读)。

2.表级锁:

作用: 锁定整个表,粒度较大,并发度低 ,但锁开销较小。

  • 适用场景: MyISAM存储引擎 默认锁机制(InnoDB也支持,但更常用行锁),适合读多写少的场景。

  • 类型:

    • 表读锁: 多个事务 可以加读锁,允许读表,但阻塞写操作(包括加写锁)。
    • 表写锁: 一个事务加锁后,独占表阻塞其他所有读锁和写锁。
  • 特点: MyISAM写锁优先级高于读锁 ,可能导致读请求饿死(一直等待写锁释放)。

3.行级锁:

  • 作用: 锁定单行记录,粒度最小,并发度最高,锁开销最大。
  • 适用场景: InnoDB存储引擎的核心锁机制 ,适合写操作频繁的场景(如电商订单、库存更新)。
  • 类型:
    • 行读锁: 事务对某行加读锁后,其他事务可以加读锁,但不能加写锁。
    • 行写锁: 事务对某行加锁后,其他事务不能加读锁或写锁。
  • 特点:InnoDB的行锁基于索引 实现,若查询未命中索引,会升级为表锁。

二、按锁的功能划分:

1.共享锁(Shared Lock,S锁):

  • 又称: 读锁。
  • 特性: 多个事务可以同时持有同一资源的S锁,允许读操作,但阻塞写操作(X锁)。
  • 加锁方式: SELECT ... LOCK IN SHARE MODE (InnoDB 中,显式加读锁)。

2.排他锁(Exclusive Lock X锁):

  • 又称写锁。
  • 特性:一个事务持有X锁后,其他事务不能持有该资源的S锁或X锁,独占资源用于写操作。
  • 加锁方式SELECT ... FOR UPDATE;(InnoDB 中,显式加写锁);默认情况下,UPDATE/DELETE/INSERT 会自动加 X 锁。

三、InnoDB特有的锁(基于事务和索引):

1.意向锁:

  • 作用: 表级锁,用于标识"事务稍后会对表中的行加S锁或X锁",避免表锁与行锁的冲突检查效率问题。
  • 类型:
    • 意向共享锁(Intention Shared Lock IS锁): 事务计划对表中的某些行加S锁,加行S锁前需要先加IS锁。
    • 意向排他锁(IX锁): 事务计划对表中的某些行加X锁,加行X锁前需要先加IX锁。

2.记录锁:

  • 作用: 锁定索引记录本身(具体某一行),防止其他事务修改或删除该记录。
  • 示例: WHERE id=10 id是主键,InnoDB会锁定id=10的这一行。

3.间隙锁:

  • 作用 :锁定索引记录之间的"间隙 ",不包括记录本身,防止其他事务在间隙中插入新纪录。(解决"幻读"问题)。
  • 适用场景 :InnoDB的RR隔离级别(默认级别)。
  • 示例 :表中id=5、10,WHERE id BETWEEN 5 AND 10 ,会锁定(5,10)之间的间隙,阻止插入id=6、7等记录。

4.临建锁:

  • 作用记录锁+间隙锁的组合,锁定索引记录以及前面的间隙(左开右闭),是InnoDB RR级别下默认的行锁方式。
  • 示例 :表中id=5、10,WHERE id=10会锁定 (5,10] 区间。
相关推荐
广州灵眸科技有限公司12 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
Cloud云卷云舒15 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手15 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学15 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh17 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
用户713335851562418 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
z1234567898618 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD18 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo18 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
用户713335851562419 小时前
MySQL - InnoDB 的 Buffer Pool
mysql