memtable读操作疑问

在最后一种情况下,事务在读取99版本数据的时候还未提交,假如说99版本的数据一致不提交,是不是会阻塞读操作。另外,OB默认是read commit,读取的是已提交的事务,为啥独到的不是90时刻的数据呢

最后一条蓝色部分是提交中,因为事务的提交版本号还没有确定,这个时候这个读操作需要等待。虽然ob是rc隔离级别,但由于采用了多版本并发控制,内部语句执行需要依赖版本号

1 个赞

你的第1个疑问:假如99版本的数据一直不提交,确实是会导致这个读操作阻塞。

OB的两阶段提交需要写两个版本号,prepare version和commit version,当一个大事务,提交时间很长,prepare version已经明确且写入内存事务表,而commit version还未明确,在这种前提下,读事务的snapshot version > prepare version ,就需要等待这个事务完成异步的commit ok阶段,commit version明确且写入内存事务表,这样snapshot version才能判断是否大于或者小于 commit version。如果大于,读该事务修改的数据,如果小于,则通过MVCC读取undo retention范围内的历史版本。

如果读操作的snapshot version < prepare version那么直接 通过MVCC读取undo retention范围内的历史版本。

1 个赞

这个图缺少了prepare version的内容,所以没办法理解

感谢,理解起来有点难。我下去在好好学习一下2阶段提交