4

我一直在 PostgreSQL 中学习 MVCC。据我了解,当更新行时,将添加一个新行xmax,旧行中的值将具有xmin新添加行的值。当我在我的 Postgres DB 中的表中检查它时,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
4

1 回答 1

3

xmax双重职责:它用于标记可见性(与 一起xmin,但它也用于保持行锁

为了消除这两种用途之间的歧义,事务的状态和元组中进一步的“不可见”标志被使用。

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

有关更多信息,请参阅此答案我的博客文章

于 2019-02-21T20:53:31.317 回答