03-事务隔离级别与锁机制
type
status
date
slug
summary
tags
category
icon
password
1️⃣ 事务隔离级别(Transaction Isolation Level)
SQL 标准定义了 4 个隔离级别,MySQL 也支持这 4 种(通过
InnoDB
引擎实现):隔离级别 | 脏读(Dirty Read) | 不可重复读(Non-repeatable Read) | 幻读(Phantom Read) |
READ UNCOMMITTED | ✅ 可能 | ✅ 可能 | ✅ 可能 |
READ COMMITTED | ❌ 不可 | ✅ 可能 | ✅ 可能 |
REPEATABLE READ | ❌ 不可 | ❌ 不可 | ✅ 可能(InnoDB 实际避免了幻读) |
SERIALIZABLE | ❌ 不可 | ❌ 不可 | ❌ 不可 |
MySQL 默认隔离级别:(READ-COMMITTED)
2️⃣ 三大并发问题示例(基于隔离级别)
- 脏读(Dirty Read)
- A 事务读取了 B 未提交的数据 → B 回滚 → A 读取的是无效数据。
- 不可重复读(Non-repeatable Read)
- A 事务两次读取同一行数据,中间 B 修改并提交 → A 读到不同结果。
- 幻读(Phantom Read)
- A 事务多次执行相同的范围查询,中间 B 插入了新数据 → A 读到“幻影”记录。
3️⃣ 锁机制(Lock Mechanism)
InnoDB 存储引擎支持以下几种锁:
- 表锁(Table Lock)
- 锁住整张表,操作简单,冲突大。
- 比如:
LOCK TABLES ... WRITE/READ
- 行锁(Row Lock)✅ 推荐
- InnoDB 的核心能力之一,粒度细,效率高。
- 意向锁(Intention Lock)
- 系统自动添加,表示“即将”在行上加锁,避免表锁与行锁冲突。
- 行级锁的分类
锁类型 | 描述 |
共享锁 (S锁) | SELECT ... LOCK IN SHARE MODE :允许多个事务读取,但不能修改 |
排它锁 (X锁) | SELECT ... FOR UPDATE :禁止其他事务读/写该行 |
4️⃣ 隔离级别与锁的对应关系
隔离级别 | 锁行为(InnoDB 实现) |
READ UNCOMMITTED | 不加锁,允许读未提交数据(脏读) |
READ COMMITTED | 每次读都加共享锁(行级),读提交版本(快照读) |
REPEATABLE READ | 第一次读时加快照,后续一致(避免不可重复读) |
SERIALIZABLE | 对所有读操作加共享锁,范围读也会加锁(加表锁) |
5️⃣ MVCC(多版本并发控制)
InnoDB 使用 MVCC(Multi-Version Concurrency Control) 来避免加锁情况下的性能问题。
适用:
READ COMMITTED
和 REPEATABLE READ
原理:
- 每行记录有两个隐藏字段:
trx_id
:最后一次修改该行的事务IDroll_pointer
:回滚指针,指向 undo log 的旧版本数据
- 读取时比较当前事务的
id
与记录的trx_id
来判断可见性
6️⃣ 可视化总结
❗四种隔离级别 vs 三大并发问题
隔离级别 | 脏读 | 不可重复读 | 幻读 | MVCC支持 | 行锁支持 |
READ UNCOMMITTED | ✅ | ✅ | ✅ | ❌ | ❌(极少) |
READ COMMITTED | ❌ | ✅ | ✅ | ✅ | ✅ |
REPEATABLE READ | ❌ | ❌ | ✅* | ✅ | ✅ |
SERIALIZABLE | ❌ | ❌ | ❌ | ❌ | ✅(范围锁) |
上一篇
02-explain
下一篇
04-MVCC
Loading...