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.
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().
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 .