2014-06-24 4 views
1

FOR UPDATE 절이 하위 쿼리에서 사용되는 경우에도 UPDATE 연산 후 xmax 값을 0으로 설정하면 안되는 것이 아닌지 궁금합니다.FOR UPDATE와의 이상한 정리 동작

내가 테스트 테이블 만들었습니다

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 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 after update

올바른 동작입니까? 그렇다면 작동 후 xmax가 0으로 설정되지 않는 이유는 무엇입니까?

답변

1

예, 올바른 동작입니다. Xmax는 updater뿐만 아니라 락커에도 사용되며, t_infomask에 LOCK 비트가 설정되면 0이 아닌 값을 무시하는 것이 값의 독자에게 달려 있습니다 (t_infomask의 비트 값은 src/include/access/htup_details.h을 참조하십시오). 일반 SQL 인터페이스에서 t_infomask에 액세스 할 수는 없지만 액세스 할 수있는 확장자는 pageinspect입니다.

튜플은 외래 키 검사로도 잠글 수 있으므로 이 아니므로 Xmax에 0 이외의 값이 나타날 수 있습니다.

+0

답변 해 주셔서 감사합니다. 그 정보를 어디에서 찾을 수 있을지 아십니까? 문서에서 예를 들어 외래 키 검사에 대해 아무 것도 찾을 수 없습니다. – Borys

+1

나는 이런 종류의 것을 문서화 한 것 같지 않다. 우리가 문서화한다면, 사람들은 특정한 표현 방식에 의존하게 될 것이기 때문에 미래의 기본 표현을 바꿀 때마다 문제가 될 것입니다. 물론 PostgreSQL의 소스 코드는 언제든지 읽을 수 있습니다. – alvherre

+0

답장을 보내 주셔서 감사합니다. – Borys