Postgres 테이블에는 일반 열 외에도 다양한 시스템 열이 있습니다. 그 중 하나 인 xmin
행을 만드는 데 사용 된 트랜잭션 ID를 저장합니다. 그것의 데이터 타입은 xid
어떤 시점에서 랩핑하는 4 바이트 정수이다 (즉, 반드시 고유하지는 않다). 이 함수 txid_current()
는 현재 트랜잭션 ID를 반환하지만 bigint
""epoch "카운터로 확장되어 설치 기간 동안 줄 바꿈되지 않기 때문에로 매뉴얼 을 반환합니다 ( manual 인용 ).
트랜잭션 랩 어라운드가 아직 발생하지 않은 경우 두 값이 모두 일치하는 것 같습니다.
# CREATE TABLE test (label text);
CREATE TABLE
# INSERT INTO test VALUES ('test') RETURNING txid_current();
txid_current
--------------
674500
(1 row)
INSERT 0 1
# SELECT xmin FROM test;
xmin
--------
674500
(1 row)
그러나 나는이 두 값이 항상 비교 가능한지 궁금합니다. 내가 이해하는 한, txid_current()
트랜잭션 ID 랩 어라운드 후 (최대 2 ^ 32 트랜잭션) 고유 값을 계속 제공 xmin
하며 0에서 시작합니다. 이것은 그 시점에서 둘 다 다른 값을 반환하기 시작한다는 것을 의미합니까?
이것이 사실이라면, 정기적으로 추출하는 방법이 xid
의 txid_current()
그것과 일치 할 수 있도록 결과 xmin
테이블 (예를 들어, 주조 항목을 txid_current()
정수로)는?
편집 : 트랜잭션 ID 랩 어라운드 후 발생하는 일에 대해 신경 써야합니다. 이는 2 ^ 32 트랜잭션보다 훨씬 오래 전에 발생합니다. 의견에 이것을 지적한 Daniel Vérité에게 감사드립니다.
xmin
얼어 붙 더라도 문제는 여전히 xmin
실행 된 것과 비교하여 얼마나 새로운 (일반)인지를 나타냅니다 txid_current()
.
VACUUM FREEZE
덮어 쓰고 있다는 사실을 무시하고xmin
있습니다. 주제에 대한 개요는 튜플 고정 해제 를 확인하십시오 .