在什么情况下xmin列中的值可以大于xmax列中的值



我目前有一个问题,即试图删除一些行的事务只是挂起。我找到了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

xmax可以有几种含义。如果你能看到这行,那就意味着

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

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

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

除非您遇到指示数据损坏的错误,否则我认为没有什么可担心的。也许你看到你的事务不会花费那么长的时间,因为长时间的事务会给数据库带来各种麻烦。