查询TiKV时为什么要去获取 Snapshot?

请问TiDB读流程里一开始就已经向PD获取了TSO,我理解根据这个TSO就可以去TiKV里查出来最接近它的版本(MVCC原理),找到这个版本对应的value值。为什么还要去获取Snapshot?这一步的作用是什么?怎么实现的

在 PCTP的 《05.TiDB 数据库SQL执行流程 》中的《读取的执行》中:


在TiKV中,这个步骤是构建snapshot,并非是获取snapshot。

1 个赞

了解下mvcc机制就懂了

我问的不是mvcc,是问构建snapshot怎么做的

这里的构建是怎么做的?tso不就是等于版本号了吗?

这个是采用预分法,比如当前db向一次性取了后10秒的时间段,然后在这10秒内实例化4000个tso出来,可以供事务开始和结束使用,你可以理解为tso是一段时间内有前后顺序的标识

详细学习,你可以看下官方课程302,模块一,第四节的内容,在第二部分理解tso的分配

tso

可以这么理解,标识数据的版本号

感谢回复哦~ 但我问的是:
1、这里读取流程里面已经先去PD获取了tso对不对,既然已经获取到tso了,为什么还要在去tikv执行sql的时候还要去构建snapshot对象?
2、构建出来的snapshot对象和tso有什么区别?

1 个赞

我的理解是,这里预先获得了tsfuture,只是说明后面可以使用一系列tso,但是后面再执行过程种会根据事务的执行时间用一个tso取标记一个事务开始时的数据版本,这个就是snapshot,这里tso你可以理解为时间点标记,snapshot是快照对象,用来说明一个事务开始时数据的状态

1 个赞

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。