
隔离级别 | 脏读 | 不可重复读 | 幻读 | 并发性 | 典型应用 |
|---|---|---|---|---|---|
Read Uncommitted (RU) | 可能 | 可能 | 可能 | 最高 | 极少使用,性能优先且一致性要求低 |
Read Committed (RC) | 否 | 可能 | 可能 | 较高 | 多数 OLTP 默认 |
Repeatable Read (RR) | 否 | 否 | 基本避免 | 中等 | MySQL 默认 |
Serializable (S) | 否 | 否 | 否 | 最低 | 强一致性场景 |
隔离级别 | 间隙锁 / 临键锁 | 幻读防护 | 核心锁策略 | 说明 |
|---|---|---|---|---|
RU | 几乎不生效 | 无 | 仅记录锁 | 允许读未提交,无需锁间隙 |
RC | 不生效(外键/唯一约束除外) | 无 | 仅记录锁 | 语句级快照,不防幻读 |
RR | 生效(默认) | 有 | 临键锁(记录锁+间隙锁) | 防幻读,唯一精确匹配退化为记录锁 |
S | 生效且更广 | 完全防护 | 临键锁 + 表级意向锁 | 查询直接加锁,串行执行 |
核心逻辑:隔离级别越高,锁范围越大;隔离级别越低,更依赖 MVCC 而非锁,幻读容忍度高。
SELECT ...(无 FOR UPDATE/LOCK IN SHARE MODE)
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 |
💡 记忆:
特性 | FOR UPDATE (X锁) | LOCK IN SHARE MODE (S锁) |
|---|---|---|
允许其他事务读 | ✅ | ✅ |
允许其他事务改 | ❌ 阻塞 | ❌ 阻塞 |
自己能否改锁定行 | ✅ | ❌(需锁升级) |
RU → 锁最少,幻读横行 RC → 只锁记录,不防幻 RR → 临键锁上阵,幻读难现 S → 全程锁死,性能最差