从tuple格式看PG设计之MVCC
PG不同于其他数据库使用inplace+undo实现MVCC多版本并发控制
PG 增删改数据保存在page中
insert : 插入记录,标记t_xmin为事务ID txid,记录tuple的(page,offset)到t_ctid
update: 插入记录,修改旧记录t_xmax,t_ctid指向新记录的t_ctid ,等同于delete+insert
delete: 修改记录。
PG行记录格式


t_xmin 插入记录/元组 事务txid
t_xmax 删除/修改记录/元组 事务txid, 新插入t_xmax设置为0,
t_cid 事务内SQL执行顺序号,0开始
t_ctid 指向元组/新元组(block,offset) t_ctid
t_infomask2 HEAP_HOT_UPDATED(旧元组)HEAP_ONLY_TUPLE(无索引新元组)标志位
t_infomask 事务标准位,提交,撤销,进行中,子事务进行中
t_hoff 用户数据的偏移量
NULL bitmap null值位图
User data 实际的数据
PG采用的是MVCC的变种:快照隔离 Snapshot Isolation
活跃事务快照:xmin:xmax:xip_list (类似于其他数据库的read-view数组)
最早仍然活跃的事务:第一个尚未分配事务:活跃事务的txid列表
可视化判断:
1.不同于其他数据库,PG采用记录/元组 的t_xmin和t_xmax 判断该记录/元组对事务是否可见
2.已提交事务且未删除的记录可见,即:t_xmin< 活跃事务快照xmin,活跃事务不可见,除非事务自身 t_xmin in xip_list t_xmin = current_txid
3.已删除且提交的事务不可见 t_xmax < xmin or (xmin<t_xmax < xmax and COMMITTED)
Write-Write conflict 异同:
1.PostgreSQL在SI中使用了以先更新者为准(first-updater-win)的方案
2.相同于其他数据库:同一行并发更新,READ COMMITTED隔离等级 会等待释放锁再更新
3.不同于其他数据库:同一行并发更新,REPEATABLE READ或SERIALIZABLE隔离等级 当前事务则会立即中止,以防止丢失更新(couldn’t serialize access due to concurrent update)
因生产基本不使用,故不讨论可串行化快照隔离Serializable Snapshot Isolation




