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 COMMITTEDREPEATABLE READ
原理:
  • 每行记录有两个隐藏字段:
    • trx_id:最后一次修改该行的事务ID
    • roll_pointer:回滚指针,指向 undo log 的旧版本数据
  • 读取时比较当前事务的 id 与记录的 trx_id 来判断可见性

6️⃣ 可视化总结

❗四种隔离级别 vs 三大并发问题
隔离级别
脏读
不可重复读
幻读
MVCC支持
行锁支持
READ UNCOMMITTED
❌(极少)
READ COMMITTED
REPEATABLE READ
✅*
SERIALIZABLE
✅(范围锁)
 
上一篇
02-explain
下一篇
04-MVCC
Loading...