postgresql - 为什么 PostgreSQL 中的 xmin 和 xmax 值相同?

标签 postgresql mvcc

我一直在 PostgreSQL 中学习 MVCC。据我了解,更新行时,将添加一个新行,旧行中的 xmax 值将具有新添加行的 xmin 的值。 当我在我的 Postgres 数据库中的表中检查它时,xminxmax 值是相同的。什么意思?

   xmin   |   xmax   |    id    |     serial     | paid 
----------+----------+----------+----------------+------
 54569114 | 54569114 | 11099324 | 76605297311437 | t
 54569111 | 54569111 | 11099323 | 38131108141783 | t
 54569101 | 54569101 | 11099322 | 49399633274146 | t
 54569092 |        0 | 11099321 | 44672543705101 | f
 54569090 | 54569090 | 11099320 | 21324499293647 | t
 54569083 |        0 | 11099319 | 82878160317074 | f
 54569079 | 54569079 | 11099318 | 31091666079121 | t

最佳答案

xmax 有双重职责:它用于标记可见性(与 xmin 一起使用,但它也用于保存 row locks

为了消除这两者之间的歧义,使用事务的状态并使用元组中的其他“不可见”标志。

因此,如果您看到两个值相同的行,则创建该行的事务也锁定了该行。这通常表示元组是使用 INSERT ... ON CONFLICT 创建的。

参见 this answermy blog post获取更多信息。

关于postgresql - 为什么 PostgreSQL 中的 xmin 和 xmax 值相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815781/

相关文章:

database - 无法更改复合类型,因为列正在使用它

python - 调用存储函数或过程不会插入和保留更改

Mysql InnoDB 行锁定读取

sql - 如何避免“一次插入,一次更新”表中的数据碎片?

postgresql - 数据库内容版本控制

sql - 带有 SELECT 顺序的 Postgres INSERT INTO

c - 如何访问Postgresql c语言函数中的大对象?

postgresql - 如何检查 PostgreSQL 安装是否支持 SSL?

postgresql - PostgreSQL 事务 id (xmin) 是否按顺序出现在提交的版本中?