Xmin ve txid_current () işlemlerini ID ID ile tamamladıktan sonra nasıl karşılaştırırım?


12

Postgres tabloları normal sütunlarının yanı sıra çeşitli sistem sütunlarına da sahiptir . Bunlardan biri, xminbir satır oluşturmak için kullanılan işlem kimliğini saklar. Veri türü xid, bir noktada etrafını saran dört baytlık bir tamsayıdır (yani, benzersiz olması gerekmez). İşlev txid_current(), geçerli işlem kimliğini döndürür, ancak bigint"bir" dönem "sayacı ile genişletildiğinden, bir yükleme ömrü boyunca etrafta sarılmayacağı için" ( el kitabını belirtmek için ).

İşlemlerin sarmalaması henüz gerçekleşmediyse, her iki değer de eşleşir:

# 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)

Ama merak ediyorum: bu iki değer her zaman karşılaştırılabilir mi? Anladığım kadarıyla, txid_current()işlem kimliği sarmalamasından sonra (en fazla 2 ^ 32 işlem) benzersiz değerler sunmaya devam xminedecek ve sıfırdan başlayacaktır. Bu, her ikisinin de o noktada farklı değerler döndürmeye başladığı anlamına mı geliyor?

Ve eğer bu doğruysa, bir tablodaki girişlerle eşleşmesi için düzenli xidbir txid_current()sonuç çıkarmanın bir yolu var mıdır xmin(örneğin txid_current()tamsayıya döküm )?

Düzenleme : 2 ^ 32 işlemden çok önce gerçekleşmesi muhtemel olan bir işlem kimliği sarmalamasından sonra ne olacağını önemsediğimi netleştirin. Daniel Vérité'ye yorumlarda bunu kaydettiği için teşekkürler.


1
Sistemin 2 ^ 32 sarmalamasından çok önce satırların VACUUM FREEZEüzerine yazacağını ve üzerine yazacağınızı görmezden geliyorsunuz xmin. Konuya genel bir bakış için Tüplerinizin Dondurulması bölümüne göz atın .
Daniel Vérité

Doğru, bu gerçeği soru dışında bıraktım, işaret ettiğiniz için teşekkürler. Ve gerçekten donma 2 ^ 32'den çok önce gerçekleşecek. Bununla birlikte, eski xmindonmuş olsa bile , soru hala daha yeni (düzenli) xminbir daha sonra yapılanla ne kadar karşılaştırıldığını gösterir txid_current().
tomka

1
Paketlemeye kadar 1 milyondan az işlem kaldıysa PostgreSQL'in kapanacağını belirtmek gerekir .
user103153

Yanıtlar:


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.