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

为什么PostgreSQL中的xmin和xmax值相同?,postgresql,mvcc,Postgresql,Mvcc,我一直在PostgreSQL学习MVCC。据我所知,当更新行时,将添加新行,并且旧行中的xmax值将具有新添加行的xmin值。 当我在Postgres数据库中的表中检查它时,xmin和xmax的值是相同的。这是什么意思 xmin | xmax | id | serial | paid ----------+----------+----------+----------------+------ 54569114 | 54569114 | 110

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

   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
一起),但也用于保持可见性

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

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


有关更多信息,请参阅和。

某些记录在
xmax
中的
0
值在更新一行后变得相同。如果您注意到,在
xmin
xmax
相同的行中,paid为true。因为这是发票表,并且在付款时,发票将得到upda正如我所说,创建该行的事务必须已锁定它。请尝试找出SQL语句的确切顺序,然后您就可以理解它是如何发生的。