1

我想知道即使在子查询中使用了 FOR UPDATE 子句,在 UPDATE 操作之后是否不应将 xmax 值设置为零?

我创建了测试表:

CREATE TABLE def.dummy
(
  id serial NOT NULL,
  nazwa text,
  CONSTRAINT pk_dummy PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);

并插入了一些值:

INSERT INTO def.dummy(
            nazwa)
    VALUES ('1'),('2'),('3');

现在,当我尝试使用子查询进行 UPDATE 时:

UPDATE def.dummy AS sp
SET nazwa = 'changed' FROM
(SELECT id, nazwa, xmax, xmin
 FROM def.dummy
          WHERE id=1
AND xmax = 0
LIMIT 1 FOR UPDATE) AS get_set
WHERE get_set.id = sp.id;
RETURNING sp.*;

提交事务后,xmax 值不会重置为 0,而是保持为: 更新后的 xmax

这是正确的行为吗?如果是,为什么 xmax 在操作后不设置为零?

4

1 回答 1

1

是的,这种行为是正确的。Xmax 也用于锁存器,不仅是更新器,而且当 LOCK 位在 t_infomask 中设置时,由值的读取者来确保它忽略非零值(参见 t_infomasksrc/include/access/htup_details.h中的位值)。虽然您无法从常规 SQL 界面访问 t_infomask,但请查看pageinspect可让您访问它的扩展程序。

请注意,元组也可以通过外键检查锁定,因此不仅FOR UPDATE会导致非零值出现在Xmax.

于 2014-06-24T15:21:33.767 回答