当update、delete的时候 , 产生的undo log日志不只是回滚时需要 , 在快照读时也需要,不会被立即删除 。
Undo log版本链
不同事务或相同事务对同一条记录进行修改,会导致该记录的undo log生成一个记录的版本链表 , 链表的头部是最新的旧记录,链表的尾部是最早的旧记录 。
文章插图
执行顺序:
从上到下代表执行顺序 。在同一行代表同一时间执行 。
ReadView(读视图)ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据 , 记录并维护系统当前活跃的事务(未提交的)id
ReadView中包含了四个核心字段
字段含义m_ids当前活跃的事务id集合min_trx_id最小活跃的事务IDmax_trx_id预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)creator_trx_idReadView创建者的事务ID版本链数据访问规则
trx_id 代表的是当前事务的id
用这个id和ReadView的四个核心字段进行比对
- trx_id == creator_trx_id 可以访问该版本这个条件成立代表数据是当前这个事务更改的
- trx_id < min_trx_id 可以访问该版本 这个条件成立,说明数据已提交
- trx_id > max_trx_id 不可以访问该版本 这个条件成立 , 说明事务是在ReadView生成之后才开启的
- min_trx_id <= trx_id <= max_trx_id 如果trx_id不在m_ids中,就可以访问该版本
这个条件成立,说明数据已经提交 。
- 在Read Committed隔离级别下
在事务第一次执行快照读时都生成一个Read view
- 在Repeatable read隔离级别下
在事务第一次执行快照读时生成,后续复用这个Read view
第一个快照读,读取情况
文章插图
这个快照读,根据规则,读取的是0x00002这个地址的数据 , 对应着事务2修改后的数据内容 。
第二个快照读,读取情况
文章插图
这个快照读,根据规则读取到的是,0x00003地址的数据内容,就是事务3修改后的数据 。
在RR隔离级别下,版本链访问原理分析在RR隔离级别下 , 只有事务在第一次执行快照读的时候生成ReadView , 后续复用这个ReadView
文章插图
具体的和RC规则一致,不重复讲解 。
总结隐藏字段+Undo log版本链+ReadView组成MVCC
MVCC+锁构成事务的隔离机制
事务的一致性由Redo log和undo log共同保证
推荐阅读
- VLQ & Base64 VLQ 编码方式的原理及代码实现
- StampedLock:一个并发编程中非常重要的票据锁
- Longchamp龙骧饺子包
- <三>从编译器角度理解C++代码编译和链接原理
- <一>关于进程虚拟地址空间区域内存划分和布局
- GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署
- 🔥支持 Java 19 的轻量级应用开发框架,Solon v1.10.4 发布
- Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer
- InnoDB关于事务、锁、MVCC专题
- XXI Open Cup, Grand Prix of Belarus 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest 题解