我一直在PostgreSQL中学习MVCC。据我了解,当更新该行时,将添加一个新行,而旧行中的xmax
值将具有新添加行的xmin
的值。
当我在Postgres DB中的表中对其进行检查时,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
答案 0 :(得分:1)
xmax
有双重职责:它用于标记可见性(与xmin
一起使用,但也用于保留row locks。
要在这两种情况之间使用歧义,请使用事务的状态,并在元组中使用其他“不可见”标志。
因此,如果您看到两个值相同的行,则创建该行的事务也会锁定该行。通常,这表明该元组是使用INSERT ... ON CONFLICT
创建的。
有关更多信息,请参见this answer和my blog post。