MVCC原理之版本链

参考:《MySQL是怎样运行的》——小孩子4919

MVCC定义:每对记录进行一次更改,就会记录一条undo日志,这些undo日志通过roll_pointer属性串联成一个链表。这个链表称为版本链,我们之后会利用这个记录的版本链来控制并发事务访问相同记录的行为,这种机制就被称为多版本并发控制(Multi-Version Concurrency Control)。

那么什么是版本链呢? 对于使用innodb存储引擎来说,他的聚簇索引记录中都包含两个必要的隐藏列: trx_id:一个事务每次对聚簇索引改动时,都会把改事务的事务id赋值给trx_id列; roll_pointer:每次对聚簇索引改动是,都会把旧的版本写到undo日志中,这个列就相当于一个指针,指向旧版本的undo日志。

假设我们现在创建了一个表demo,里面插入了一条记录:

 

 假设插入改记录的事务id是80,那么此刻该记录的示意图如下:

 

假设之后两个事务id分别为100、200的事务对此记录做了UPDATE操作,操作流程如下:

trx_id:100

BEGIN;

UPDATE hero SET name='关羽' WHERE number=1;

UPDATE hero SET name='张飞' WHERE number=1;

COMMIT;

trx_id:200

BEGIN;

UPDATE hero SET name='赵云' WHERE number=1;

UPDATE hero SET name='诸葛亮' WHERE number=1;

COMMIT;

那么undo日志的roll_pointer属性会将这些undo日志串成一个链表,称为版本链,示例如下:

 

posted @ 2022-04-28 13:43  知识怪人  阅读(314)  评论(0编辑  收藏  举报