MySQL MVCC

多版本并发控制(Multi-version Concurrency Control),不同于基于锁的并发控制,它让读写操作互不阻塞,每一个写操作都会创建一个新版本的数据,读操作会从有限多个版本的数据中挑选一个最合适的结果直接返回,由此解决了事务的竞争条件。

基础概念

transaction id 事务ID,唯一自增
db_trx_id InnoDB表隐藏字段,记录当前数据对应的事务ID
db_roll_ptr InnoDB表隐藏字段,指向 undo log 中的回滚段
consistent read view 一致性读视图,又称read-view,由3部分组成

rw_trx_ids 一个数组,存储了启动但未提交的事务ID
low_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 一行记录:

  1. 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 创建后提交,不可见
  2. 如果不可见,通过 db_roll_ptr 找出可见版本、计算历史数据

当前读

当前读,直接访问位于主键索引的当前值,因此要利用基于锁的并发控制:
UPDATE 更新当前值,加X锁。
SELECT FOR UPDATE 访问当前值,加X锁。
SELECT LOCK IN SHARE MODE 访问当前值,加S锁。

参考文献

MySQL MVCC

上一篇:iOS开发UI篇—Quartz2D使用(图片剪切)


下一篇:MySQL 锁