暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从tuple格式看PG设计01

原创 zhou 2024-06-30
141

从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行记录格式


20240630030744image.png

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

最后修改时间:2024-06-30 18:42:36
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论