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

时间:2019-02-21 20:35:02

标签: postgresql mvcc

我一直在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

1 个答案:

答案 0 :(得分:1)

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

要在这两种情况之间使用歧义,请使用事务的状态,并在元组中使用其他“不可见”标志。

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

有关更多信息,请参见this answermy blog post