Postgres tabloları normal sütunlarının yanı sıra çeşitli sistem sütunlarına da sahiptir . Bunlardan biri, xmin
bir 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 xmin
edecek 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 xid
bir 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.
xmin
donmuş olsa bile , soru hala daha yeni (düzenli) xmin
bir daha sonra yapılanla ne kadar karşılaştırıldığını gösterir txid_current()
.
VACUUM FREEZE
üzerine yazacağını ve üzerine yazacağınızı görmezden geliyorsunuzxmin
. Konuya genel bir bakış için Tüplerinizin Dondurulması bölümüne göz atın .