【问题标题】:Why xmin and xmax values are same in PostgreSQL?为什么 PostgreSQL 中的 xmin 和 xmax 值相同?
【发布时间】:2019-07-15 21:08:11
【问题描述】:

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

【问题讨论】:

    标签: postgresql mvcc


    【解决方案1】:

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

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

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

    请参阅this answermy blog post 了解更多信息。

    【讨论】:

    • 一些记录在xmax 中有0 值。 xmax 值在更新一行后变得相同。如果您注意到,在xminxmax 相同的行上,payed 为 true。因为这是发票表,付款后会更新发票。
    • 正如我所说,创建该行的事务必须已锁定它。尝试找出SQL语句的确切顺序,然后您就可以了解它是如何发生的。
    猜你喜欢
    • 2022-12-01
    • 2016-10-28
    • 2016-12-27
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多