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,如果读到rowdb_trx_id>=low_limit_id,说明这些id在此之前的数据都没有提交,如注释中的描述,这些数据都不可见。

if (trx_id >= view->low_limit_id) {

return(FALSE);

}

注:readview 部分源码

 

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

if (trx_id < view->up_limit_id) {

return(TRUE);

}

 

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

 

不同隔离级别ReadView实现方式

1. read-commited:

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

 

2. repeatable read

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

 

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

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值