作者:阎书利
基于多个旧值版本的并发控制即MVCC,就是实现一致读。
PostgreSQL为每一个事务分配一个递增的、类型为int32的整数作为唯一的事务ID,即xid。
创建一个新的快照时,将收集当前正在执行的事务id和已提交的最大事务id。
根据快照提供的信息,PostgreSQL可以确定事务的操作是否对执行语句是可见的。
PostgreSQL还在系统里的每一行记录上都存储了事务相关的信息,同样用来判断一行记录对于当前事务是否可见。
在PostgreSQL的内部数据结构中,每个元组(行记录)有4个事务可见性相关的隐藏列:xmin , xmax, cmin, cmax
其中cmin和cmax分别是插入和删除该元组的命令在事务对其他事务的可见性相关;xmin保存了创建该行数据的事务的xid,xmax保存的是删除改行的xid。
sarah=# create table tbl_mvcc(id serial primary key, ival int);
CREATE TABLE
sarah=# insert into tbl_mvcc(ival) values(1);
INSERT 0 1