多版本并发控制(Multi-version Concurrency Control),不同于基于锁的并发控制,它让读写操作互不阻塞,每一个写操作都会创建一个新版本的数据,读操作会从有限多个版本的数据中挑选一个最合适的结果直接返回,由此解决了事务的竞争条件。
基础概念
transaction id
事务ID,唯一自增db_trx_id
InnoDB表隐藏字段,记录当前数据对应的事务IDdb_roll_ptr
InnoDB表隐藏字段,指向 undo log 中的回滚段consistent read view
一致性读视图,又称read-view,由3部分组成
rw_trx_ids
一个数组,存储了启动但未提交的事务IDlow_limit_id
rw_trx_ids 中的最小值up_limit_id
rw_trx_ids 中的最大值+1
consistent read
一致性读,又称快照读,保证事务中的 SELECT 看到的数据是一致的current read
当前读,读取当前值(最新版本),以保证事务的一致性
快照读
各隔离级别下的 MVCC 工作原理都一样,区别在于生成 read-view 的时机不同:RC 在 SELECT 瞬间生成,RR 在事务启动瞬间生成。
快照读适用于普通 SELECT,现在事务中 SELECT 一行记录:
- InnoDB 判断该行记录的 db_trx_id
1.1 等于 transaction id,版本在事务内部生成,可见
1.2 小于 up_limit_id,版本在 read-view 创建前提交,可见
1.3 大于 low_limit_id,版本在 raed-view 创建后提交,不可见
1.4 存在 rw_trx_ids,版本在 read-view 创建后提交,不可见 - 如果不可见,通过
db_roll_ptr
找出可见版本、计算历史数据
当前读
当前读,直接访问位于主键索引的当前值,因此要利用基于锁的并发控制:
UPDATE 更新当前值,加X锁。
SELECT FOR UPDATE 访问当前值,加X锁。
SELECT LOCK IN SHARE MODE 访问当前值,加S锁。