MYSQL-->InnoDB引擎底层原理( 四 )


当update、delete的时候 , 产生的undo log日志不只是回滚时需要 , 在快照读时也需要,不会被立即删除 。
Undo log版本链
不同事务或相同事务对同一条记录进行修改,会导致该记录的undo log生成一个记录的版本链表 , 链表的头部是最新的旧记录,链表的尾部是最早的旧记录 。

MYSQL-->InnoDB引擎底层原理

文章插图
执行顺序:
从上到下代表执行顺序 。在同一行代表同一时间执行 。
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的四个核心字段进行比对
  1. trx_id == creator_trx_id 可以访问该版本这个条件成立代表数据是当前这个事务更改的
  2. trx_id < min_trx_id           可以访问该版本          这个条件成立,说明数据已提交
  3. trx_id > max_trx_id          不可以访问该版本      这个条件成立 , 说明事务是在ReadView生成之后才开启的
  4. min_trx_id <= trx_id <= max_trx_id    如果trx_id不在m_ids中,就可以访问该版本
    这个条件成立,说明数据已经提交 。
根据隔离级别的不同ReadView生成时机不同
  1. 在Read Committed隔离级别下
    在事务第一次执行快照读时都生成一个Read view
  2. 在Repeatable read隔离级别下
    在事务第一次执行快照读时生成,后续复用这个Read view
在RC隔离级别下,版本链访问原理分析在事务第一次执行快照读时都生成一个Read view
第一个快照读,读取情况
MYSQL--&gt;InnoDB引擎底层原理

文章插图
这个快照读,根据规则,读取的是0x00002这个地址的数据 , 对应着事务2修改后的数据内容 。
第二个快照读,读取情况
MYSQL--&gt;InnoDB引擎底层原理

文章插图
这个快照读,根据规则读取到的是,0x00003地址的数据内容,就是事务3修改后的数据 。
在RR隔离级别下,版本链访问原理分析在RR隔离级别下 , 只有事务在第一次执行快照读的时候生成ReadView , 后续复用这个ReadView
MYSQL--&gt;InnoDB引擎底层原理

文章插图
具体的和RC规则一致,不重复讲解 。
总结隐藏字段+Undo log版本链+ReadView组成MVCC
MVCC+锁构成事务的隔离机制
事务的一致性由Redo log和undo log共同保证

推荐阅读