前置知识: MySQL

事务隔离级别底层实现

1 minAdvanced2026/6/14

MySQL InnoDB事务隔离级别底层实现:锁机制、MVCC、Read View与各隔离级别的实现细节

1. InnoDB 隔离级别实现概述

InnoDB 通过 MVCC + 锁机制实现不同隔离级别。

隔离级别快照读实现当前读实现
READ COMMITTED每次 SELECT 新 Read View行级记录锁
REPEATABLE READ事务首次 SELECT 的 Read ViewNext-Key Lock
SERIALIZABLE所有 SELECT 加共享锁Next-Key Lock

2. READ COMMITTED 实现

2.1 快照读

-- 每次 SELECT 生成新的 Read View
BEGIN;
SELECT * FROM t WHERE id = 1;  -- Read View 1
-- 其他事务修改并提交
SELECT * FROM t WHERE id = 1;  -- Read View 2(新快照,能看到已提交修改)
COMMIT;

2.2 当前读

-- 当前读使用记录锁,不加间隙锁
BEGIN;
SELECT * FROM t WHERE id > 5 FOR UPDATE;
-- 只锁定 id > 5 的已有记录
-- 其他事务可以插入 id = 6 的新行

3. REPEATABLE READ 实现

3.1 快照读

-- 事务首次 SELECT 生成 Read View,后续复用
BEGIN;
SELECT * FROM t WHERE id = 1;  -- 生成 Read View
-- 其他事务修改并提交
SELECT * FROM t WHERE id = 1;  -- 复用 Read View,看不到修改
COMMIT;

3.2 当前读

-- 当前读使用 Next-Key Lock(记录锁 + 间隙锁)
BEGIN;
SELECT * FROM t WHERE id > 5 FOR UPDATE;
-- 锁定 id > 5 的所有记录和间隙
-- 其他事务不能插入 id > 5 的新行

4. SERIALIZABLE 实现

-- 所有 SELECT 自动加共享锁
-- 等价于 SELECT ... LOCK IN SHARE MODE
BEGIN;
SELECT * FROM t WHERE id = 1;  -- 自动加 S 锁
-- 其他事务无法修改 id = 1
COMMIT;

5. Read View 详解

5.1 核心字段

m_ids:创建时所有活跃事务ID列表
min_trx_id:m_ids 中最小值
max_trx_id:下一个将分配的事务ID
creator_trx_id:创建者事务ID

5.2 可见性判断

对于版本链中 trx_id:
1. trx_id < min_trx_id → 可见(事务已提交)
2. trx_id >= max_trx_id → 不可见(Read View 后开始的事务)
3. trx_id 在 m_ids 中 → 不可见(事务未提交)
4. trx_id 不在 m_ids 中 → 可见(事务已提交)