mvcc

当更新记录时,将原记录放入undo表空间中,我们查询看到的未修改的数据就是从undo表空间读取的,如果存在多个数据版本就会构成一个链表。在MySQL中就是根据记录上的回滚段指针及事物ID判断记录是否可见,具体流程如下:

       在每个事物开始时,都会将当前系统中所有的活跃事物拷贝到一个列表(read View)中,当读取一行记录时,会根据行记录上TRX_ID值与Read View中的最大TRX_ID值,最小TRX_ID值的比较来判断是否可见。 比较trx_id值是否小于read view中的最小值,如果时则说明此事物早于read view中所有事物结束,可以输出返回;如果不是,则判断TRX_ID值是否大于READ VIEW中的最大值。:

如果是:则根据行记录上的回滚指针找到回滚段中相应的对应记录且取出TRX_ID赋值给当前行的TRX_ID,并重新执行比较操作(说明此行记录在事物开始之后发生了变化)

如果不是:则判断TRX_ID值是否在READ VIEW中,如果在read view中,则根据行记录上的回滚指针找到对应记录且取出TRX_ID(说明此行记录在事物开始时处于活跃状态);如果不是,则返回记录

 

innodb表存储三个重要字段:

DB_ROW_ID;如果表没有主键或者唯一索引,则MySQL会自动创建一个6字节的rowid存在记录中

DB_TRX_ID 事物的ID

DB_ROLL_PTR:回滚段的指针

 

MVCC相关的实现:

在MySQL 中并不是根据事物的事物ID,而是根据每一行记录上的事物ID进行比较来判断记录是否可见。

 

posted @ 2020-11-05 15:03  和尚也爱看AV  阅读(101)  评论(0)    收藏  举报