postgres使用MVCC作为事务隔离,并发控制的手段。这里最关键的是数据的可见性
在heapam_visibility.c中提供了HeapTupleSatisfiesMVCC方法用来判断数据可见性。
这个函数有三个参数,也是非常重要的三个概念
- HeapTuple:要判断可见性的元组。元组就是表的一行记录,记录了表数据+系统信息
- Snapshot:MVCC快照。描述了当前事务能够看到的事务id范围和活跃事务id,可见性的判断正是基于这个快照的。
- Buffer:元组所在的数据页缓冲区。用于设置元组的一些标志位(加速事务判断逻辑),标记buffer为脏页
static bool
HeapTupleSatisfiesMVCC(HeapTuple htup, Snapshot snapshot,
Buffer buffer);每个元组中记录了这个插入这个元组的事务id:xmin和更新/删除这个元组的事务id:xmax。