postgres 中 RegisteredSnapshot 与 PushActiveSnapshot 区别

区别

RegisteredSnapshot

是对外公布的 snapshot 其它进程或 logical restore 的实例可以感知到(exportsnapshot时也能export到文件里),在创建 index 和修改系统表时可能调用。

pushActiveSnapshot

只在本事务内可见,不影响其它人的 MVCC 读,一般用于读数据。

举例

concurrent build index时,build index 有三阶段,每个阶段都开启一个事务。
1、在T1时创建index的系统表项。
2、T2时以T2为snapshot去读数据并创建index(这时pushActiveSnapshot 只在本进程内可见),这个过程允许与其它向源表写数据的事务并发,可能出现新的数据,其它人对这个index一定是不可见的,不需要registersnapshot。
3、T3时开始第二次扫描把T2之后启动事务新加的数据插入index中,然后把index标记为可用,这时需要让其它事务根据开启时间是否在T3之后来判断可否看到这个index valid了,但上次register的snapshot还是T1事务(在create index时注册的)所以需要重新registersnapshot,不能只pushActiveSnapshot。

你可能感兴趣的:(postgresql,数据库,postgresql,database)