前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POSTGRESQL 事务并发机制与 MVCC

POSTGRESQL 事务并发机制与 MVCC

作者头像
AustinDatabases
发布2021-04-01 17:08:06
6780
发布2021-04-01 17:08:06
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

其实这篇的的起因是源于一个问题,为什么POSTGRESQL 没有UNDO REDO,没有这样的表空间到底他怎么进行事务与相关的并发机制的。所以这篇可能会伴随着枯燥乏味。

这个问题的从POSTGRESQL的TUPLE 来说起,也就是行的结构,这个结构可以解释为HOT, heap only tuple 这个结构起源于POSTGRESQL 8.3

Field

Type

Length

Description

t_xmin

TransactionId

4 bytes

insert XID stamp

t_xmax

TransactionId

4 bytes

delete XID stamp

t_cid

CommandId

4 bytes

insert and/or delete CID stamp (overlays with t_xvac)

t_xvac

TransactionId

4 bytes

XID for VACUUM operation moving a row version

t_ctid

ItemPointerData

6 bytes

current TID of this or newer row version

t_infomask2

uint16

2 bytes

number of attributes, plus various flag bits

t_infomask

uint16

2 bytes

various flag bits

t_hoff

uint8

1 byte

offset to user data

上面图的结构在PG12 实际上变成了

这里t_min 存储的信息为行建立时的txid 事务号,t_max 存储的是行更新后的事务号, 如果行没有被更新则存储的值为0

POSTGRESQL 的事务的处理和并发就依靠了t_min 和 t_max 两个字段,而不去使用类似ORACLE MYSQL 的 UNDO REDO 的方式来进行数据的操作和回滚。优点是不会有类似UNDO 的表空间,以及需要清理UNDO表空间的工作。数据也一直是在数据表中,事务失败也可以以最快速的方式来进行数据的“回滚”。

我们可以做一个实验看看POSTGRESQL 是怎么来对待数据的 I D U 的操作,

上图中,在插入了一条数据后, t_xmin 初始了一个数值, t_xmax 值为0 , t_ctid = 0 , 在我们更新了数据后, 产生了两条记录,一条是原有的记录,另一条是新的记录。并且在原有的记录上xmax 上记录了新的记录的事务号。

在我们删除了记录后,会在产生一条新的记录,并更新t_xmin 和 t_xmax 的记录的事务号。

通过这样的手段,POSTGRESQL 实现了MVCC 多版本的控制,在多个事务访问和更改数据的时候会存在多个版本的数据行。

通过上面的程序我们可以来分析x_xmin x_xmax 对于数据库多版本和并发的作用。

MVCC 多版本控制在POSTGRESQL 上最终想实现的目的是,数据读不堵塞写,但这样的实现的方式有以下注意的事项

1 不同的事务会看到不同版本的记录,所以POSTGRESQL 会保留较多的同一数据的多个版本。

2 事务的ID 为32BIT, POSTGRESQL 必须不断的进行清理DEAD TUMPLE,防止数据库出现FREEZE的情况。上面的彩色图右侧是这部分问题的原理解释。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档