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进行比较来判断记录是否可见。
许多文章都是从书本获取,并非自己原创,为了自己更好的记忆和学习,如果涉及版权,请说明,我会删除。