欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

MySQL InnoDB 事务隔离:MVCC 快照读与 Undo Log 版本链

发表于:|最后更新:|分类:数据库与存储|阅读:4381 次

InnoDB 通过 MVCC(多版本并发控制) 实现可重复读(RR)隔离级别:每行记录隐藏 DB_TRX_ID 与 DB_ROLL_PTR 字段,旧版本数据保留在 Undo Log 中形成版本链,快照读通过 Read View 判断行的可见性。

一、Read View 可见性判定核心逻辑

sql
-- 查看当前活动事务与隔离级别
SELECT @@transaction_isolation;
SELECT * FROM information_schema.innodb_trx;

-- 模拟:事务 A 开启快照读,事务 B 更新同一条记录
-- 事务 A(RR 隔离级别)
START TRANSACTION WITH CONSISTENT SNAPSHOT;
SELECT balance FROM accounts WHERE id = 1; -- 读取历史快照版本

-- 事务 B
UPDATE accounts SET balance = balance + 100 WHERE id = 1;
COMMIT;

-- 事务 A 再次读取,仍看到旧版本(可重复读)
SELECT balance FROM accounts WHERE id = 1;
COMMIT;