트랜잭션 ID 랩 후 xmin과 txid_current ()를 비교하는 방법은 무엇입니까?


12

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에서 시작합니다. 이것은 그 시점에서 둘 다 다른 값을 반환하기 시작한다는 것을 의미합니까?

이것이 사실이라면, 정기적으로 추출하는 방법이 xidtxid_current()그것과 일치 할 수 있도록 결과 xmin테이블 (예를 들어, 주조 항목을 txid_current()정수로)는?

편집 : 트랜잭션 ID 랩 어라운드 후 발생하는 일에 대해 신경 써야합니다. 이는 2 ^ 32 트랜잭션보다 훨씬 오래 전에 발생합니다. 의견에 이것을 지적한 Daniel Vérité에게 감사드립니다.


1
시스템이 2 ^ 32 랩 어라운드 이전의 행을 VACUUM FREEZE덮어 쓰고 있다는 사실을 무시하고 xmin있습니다. 주제에 대한 개요는 튜플 고정 해제 를 확인하십시오 .
Daniel Vérité

사실, 나는 그것을 지적 해 주셔서 감사합니다. 그리고 실제로 냉동은 2 ^ 32 이전에 일어날 것입니다. 그러나 오래된 것이 xmin얼어 붙 더라도 문제는 여전히 xmin실행 된 것과 비교하여 얼마나 새로운 (일반)인지를 나타냅니다 txid_current().
tomka

1
랩 어라운드까지 남은 트랜잭션 수가 1 개 미만인 경우 PostgreSQL이 종료됩니다 .
user103153

답변:


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.