为什么PostgreSQL中的xmin和xmax值相同?
我一直在PostgreSQL学习MVCC。据我所知,当更新行时,将添加新行,并且旧行中的为什么PostgreSQL中的xmin和xmax值相同?,postgresql,mvcc,Postgresql,Mvcc,我一直在PostgreSQL学习MVCC。据我所知,当更新行时,将添加新行,并且旧行中的xmax值将具有新添加行的xmin值。 当我在Postgres数据库中的表中检查它时,xmin和xmax的值是相同的。这是什么意思 xmin | xmax | id | serial | paid ----------+----------+----------+----------------+------ 54569114 | 54569114 | 110
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语句的确切顺序,然后您就可以理解它是如何发生的。