Selain kolom regulernya, tabel Postgres juga memiliki berbagai kolom sistem . Salah satunya,, xminmenyimpan ID transaksi yang digunakan untuk membuat baris. Tipe datanya adalah xid, integer empat byte yang membungkus di beberapa titik (yaitu belum tentu unik). Fungsi txid_current()pada gilirannya mengembalikan ID transaksi saat ini, tetapi sebagai bigint, karena "diperpanjang dengan penghitung" zaman "sehingga tidak akan membungkus selama masa instalasi" (mengutip manual ).
Jika penyelesaian transaksi belum terjadi, kedua nilai tersebut tampaknya cocok:
# 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)
Tetapi saya bertanya-tanya: apakah kedua nilai ini selalu sebanding? Sejauh yang saya mengerti, txid_current()akan terus memberikan nilai-nilai unik setelah penyelesaian ID transaksi (paling banyak 2 ^ 32 transaksi) dan xminakan mulai dari nol. Ini berarti keduanya mulai mengembalikan nilai yang berbeda pada saat itu?
Dan jika ini benar, apakah ada cara untuk mengekstrak rutin xiddari txid_current()hasil sehingga akan cocok xminentri dalam tabel (misalnya pengecoran txid_current()ke integer)?
Sunting : Jelaskan bahwa saya peduli tentang apa yang terjadi setelah penyelesaian ID transaksi, yang sangat mungkin terjadi jauh sebelum 2 ^ 32 transaksi. Terima kasih kepada Daniel Vérité karena mencatat ini di komentar.
xminmenjadi beku pertanyaannya masih berdiri bagaimana baru (biasa) xmindibandingkan dengan yang kemudian dieksekusi txid_current().
VACUUM FREEZEdan menimpaxminbaris pada jauh sebelum sampul 2 ^ 32. Lihat Membekukan Tuples Anda Mati untuk gambaran umum tentang subjek.