首页 > 数据库技术 > 详细

MySQL MVCC

时间:2020-10-19 13:00:29      阅读:43      评论:0      收藏:0      [点我收藏+]

多版本并发控制(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

原文:https://www.cnblogs.com/mougg/p/13839102.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!