首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >老生常谈MVCC事务隔离级别和MYSQL各种锁机制

老生常谈MVCC事务隔离级别和MYSQL各种锁机制

作者头像
Ynchen
发布于 2025-12-21 13:33:11
发布于 2025-12-21 13:33:11
5870
举报

MySQL 事务隔离级别与锁机制全解

一、事务隔离级别概览

隔离级别

脏读

不可重复读

幻读

并发性

典型应用

Read Uncommitted (RU)

可能

可能

可能

最高

极少使用,性能优先且一致性要求低

Read Committed (RC)

否

可能

可能

较高

多数 OLTP 默认

Repeatable Read (RR)

否

否

基本避免

中等

MySQL 默认

Serializable (S)

否

否

否

最低

强一致性场景


二、不同隔离级别下锁的行为差异

隔离级别

间隙锁 / 临键锁

幻读防护

核心锁策略

说明

RU

几乎不生效

无

仅记录锁

允许读未提交,无需锁间隙

RC

不生效(外键/唯一约束除外)

无

仅记录锁

语句级快照,不防幻读

RR

生效(默认)

有

临键锁(记录锁+间隙锁)

防幻读,唯一精确匹配退化为记录锁

S

生效且更广

完全防护

临键锁 + 表级意向锁

查询直接加锁,串行执行

核心逻辑:隔离级别越高,锁范围越大;隔离级别越低,更依赖 MVCC 而非锁,幻读容忍度高。


三、MVCC 的两种读

  1. 快照读(不加锁,读历史版本)
    • SELECT ...(无 FOR UPDATE/LOCK IN SHARE MODE)
    • RC:每次生成新快照 RR:首次生成快照,后续沿用,防不可重复读
  2. 当前读(直接读最新版本,会加锁)
    • SELECT ... FOR UPDATE(排他锁 X)
    • SELECT ... LOCK IN SHARE MODE(共享锁 S)
    • UPDATE / DELETE(排他锁 X)

四、锁类型与触发场景

锁类型

粒度

作用

典型触发

记录锁 (Record Lock)

单行索引记录

锁定已有记录

精确匹配唯一索引

间隙锁 (Gap Lock)

索引间隙

阻止插入

RR 下范围查询未命中

临键锁 (Next-Key Lock)

记录+间隙

防幻读

RR 下范围命中

共享锁 (S)

行

允许并发读,不改

LOCK IN SHARE MODE

排他锁 (X)

行

自己可改,别人阻塞

UPDATE/DELETE/FOR UPDATE

💡 记忆:

  • 记录锁 → 锁你坐的椅子
  • 间隙锁 → 锁你旁边的空位
  • 临键锁 → 椅子 + 前面的空位一起锁

五、RR 下加锁规则

  • 范围命中 → 临键锁(记录+前间隙)
  • 范围空集 → 间隙锁
  • 唯一精确匹配 → 记录锁

六、FOR UPDATE vs LOCK IN SHARE MODE

特性

FOR UPDATE (X锁)

LOCK IN SHARE MODE (S锁)

允许其他事务读

✅

✅

允许其他事务改

❌ 阻塞

❌ 阻塞

自己能否改锁定行

✅

❌(需锁升级)


七、为什么 RR 能防幻读

  • RR 会给范围内的已有记录 + 间隙加锁,阻止其他事务插入满足条件的新行
  • 这样事务重复执行相同条件的当前读,结果不会出现“多出来”的行
  • RC 不加间隙锁,因此新行可能被插入,重复读会出现幻读

八、总结口诀

RU → 锁最少,幻读横行 RC → 只锁记录,不防幻 RR → 临键锁上阵,幻读难现 S → 全程锁死,性能最差

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • MySQL 事务隔离级别与锁机制全解
    • 一、事务隔离级别概览
    • 二、不同隔离级别下锁的行为差异
    • 三、MVCC 的两种读
    • 四、锁类型与触发场景
    • 五、RR 下加锁规则
    • 六、FOR UPDATE vs LOCK IN SHARE MODE
    • 七、为什么 RR 能防幻读
    • 八、总结口诀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档