【问题标题】:Under what scenario can value in xmin column be greater than in xmax column什么情况下xmin列的值可以大于xmax列的值
【发布时间】:2022-12-01 17:25:00
【问题描述】:

我目前遇到一个问题,试图删除某些行的事务只是挂起。我找到了行,其中 xmax 值设置为该事务 ID。有趣的是,有几行 xmax 低于 xmin。此外,上述 xmax 值是在 xmin 大于与上述事务关联的 backend_xmin 值的行上设置的。我将非常感谢提示或解释,为什么 xmin 大于 xmax。

我的数据摘录如下

tableoid   cmax xmax       cmin xmin        ctid        id
15979773    1   1838047967  1   1838054693  (10508,58)  391992038
15979773    1   1838047967  1   1838071633  (10525,48)  391833021
15979773    1   1838047967  1   1838075176  (10548,9)   391294625
15979773    1   1838047967  1   1838075891  (10543,28)  391590003
15979773    1   1838047967  1   1838076423  (10539,37)  391871511
15979773    1   1838047967  1   1838076905  (10539,39)  392007013
15979773    1   1838047967  1   1838078116  (10543,47)  391833029
15979773    1   1838047967  1   1838078121  (10540,56)  391855133
15979773    1   1838047967  1   1838078123  (10541,54)  391867004
15979773    1   1838047967  1   1838078125  (10550,27)  391503024

xmax 中的事务状态为:

SELECT pg_xact_status (xid8 '1838047967');
in progress

xid 地址还没有被环绕,因为在开始新事务后它的 xid 大于上面的值:

begin;
    SELECT * FROM txid_current();
end;
commit;

1848210508

不幸的是我不能使用 pageinspect

我运行的 Postres 版本是14.3

【问题讨论】:

  • 这是什么版本?您是通过 pageinspect 之类的东西看到的,还是只是在普通的可见表行中看到的?您的系统是否足够旧以致于已经或接近环绕 xid 地址?你能告诉我们你实际看到了什么吗?

标签: postgresql


【解决方案1】:

xmaxcan have several meanings。如果你能看到这一行,那可能意味着

  1. 事务更新或删除了行,但被回滚

  2. 一个事务锁定了行,但没有修改它

    看到xmax略低于xmin,肯定是有长时间运行的事务(不好)。这些长时间运行的事务之一锁定或更新了由稍后启动的事务创建的行(这在 READ COMMITTED 隔离级别中是可能的。

    除非您遇到指示数据损坏的错误,否则我会说没有什么可担心的。也许会看到您的事务不会花费那么长的时间——长事务会在数据库中引起各种问题。

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2020-10-02
    • 2018-08-22
    • 1970-01-01
    • 2016-10-28
    • 2021-10-30
    相关资源
    最近更新 更多