1. undolog多版本链
MVCC通过为每行数据项维护多个版本来实现并发控制。当一个事务对数据进行修改时,它不会直接覆盖现有的数据,而是创建一个新的版本。这些不能数据版本形成了单向版本链。
2. readview视图
readview组成:
- 当前活跃的事务ID数组
- 最小事务m_ids
- 最大事务max_id
- 当前事务creator_trx_id
3. readview创建时机
- START TRANSACTION WITH CONSISTENT SNAPSHOT; 立即创建快照
- Start Transaction 对于RR来说第一个select语句,对于RC来说每条select语句都会创建。
4. 可见性规则
- 版本的事务ID小于m_ids:该版本在Read View创建之前已经提交,因此对当前事务可见。
- 版本的事务ID大于max_id:该版本在Read View创建之后生成,因此对当前事务不可见。
- 版本的事务ID在m_ids和max_id之间:如果版本的事务ID不在活跃事务列表中,则该版本已经提交,对当前事务可见。如果版本的事务ID在活跃事务列表中,则该版本尚未提交,对当前事务不可见
特别备注: 如果是当前事务creator_trx_id操作的数据,也是可见的!!
5. 快照读和当前读
- 快照读:查询select语句属于快照读
- 当前读: 删除更新类语句属于当前读,读的是数据库已经提交的数据
6. select数据是如何可见或者不可见的?
从undolog版本链的头部开始遍历,根据每个数据版本的事务ID,结合readview以及可见性的规则,来判定数据是否可见。