Mysql隔离性之Read View

Mysql隔离性之Read View

当前事务能读取到哪个历史版本?

 

Read View是事务开启时,当前所有事务的一个集合,这个数据结构中存储了当前Read View中最大的ID及最小的ID。

 

这就是当前活跃事务列表,如下所示:

ct-trx --> trx11 --> trx9 --> trx6 --> trx5 --> trx3;

ct-trx 表示当前事务的id,对应上面的read_view数据结构如下,

read_view->creator_trx_id = ct-trx;

read_view->up_limit_id = trx3; 低水位

read_view->low_limit_id = trx11; 高水位

read_view->trx_ids = [trx11, trx9, trx6, trx5, trx3];

 

low_limit_id是“高水位”,即当时活跃事务的最大id,如果读到row的db_trx_id>=low_limit_id,说明这些id在此之前的数据都没有提交,如注释中的描述,这些数据都不可见。

if (trx_id >= view->low_limit_id) {

return(FALSE);

}

注:readview 部分源码

 

up_limit_id是“低水位”,即当时活跃事务列表的最小事务id,如果row的db_trx_id<up_limit_id,说明这些数据在事务创建id的时都已经提交,如注释中的描述,这些数据均可见。

if (trx_id < view->up_limit_id) {

return(TRUE);

}

 

row的db_trx_id在low_limit_id和up_limit_id之间,则查找该记录的db_trx_id是否在自己事务的read_view->trx_ids列表中,如果在则该记录的当前版本不可见,否则该记录的当前版本可见。

 

不同隔离级别ReadView实现方式

1. read-commited:

Mysql隔离性之Read View

即:在每次语句执行的过程中,都关闭read_view, 重新在row_search_for_mysql函数中创建当前的一份read_view。这样就会产生不可重复读现象发生。

 

2. repeatable read:

在repeatable read的隔离级别下,创建事务trx结构的时候,就生成了当前的global read view。使用trx_assign_read_view函数创建,一直维持到事务结束。在事务结束这段时间内 每一次查询都不会重新重建Read View , 从而实现了可重复读。

 

欲知后事(目前没有喔),请点击这里喔!

上一篇:性能优化利器:剖析MySQL 5.7新特征 sys schema


下一篇:MySQL Transaction--使用SHOW INNODB STATUS 查看未提交事务