关系型数据库多版本并发控制
MVCC 是什么?
靠 undo log 版本链 + ReadView 实现「读不加锁」
类比:文档的历史版本,你读的是打开那一刻的那一版
它解决什么
读写互相阻塞是数据库性能大敌。MVCC 让读操作读取一个历史快照,不需要加锁,写操作也不阻塞读,从而大幅提升并发。
怎么实现的
每行记录有隐藏字段:最近修改它的事务 ID(DB_TRX_ID)和指向 undo log 旧版本的指针(DB_ROLL_PTR)。
- 版本链:每次修改都把旧值写进 undo log,串成链表
- ReadView:事务开始时记录当前活跃事务 ID 列表
- 可见性判断:沿版本链找第一个「已提交且早于快照」的版本
- RC 每条语句新建 ReadView,RR 只在第一次查询时建
副作用
长事务会导致 undo log 无法清理,版本链越来越长,查询变慢、表空间膨胀。这也是「不要写长事务」的技术原因。