Poin-poin penting untuk dipahami:
-
Semuanya sedang dalam suatu transaksi. Jika Anda tidak membuatnya secara eksplisit dengan
BEGIN
danCOMMIT
(atauROLLBACK
) satu dibuat untuk Anda hanya untuk pernyataan itu. -
SELECT
hanya baca-saja s tidak mendapatkan ID transaksi lengkap, mereka hanya mendapatkan ID transaksi virtual. Jadi meskipun transaksi,SELECT 1;
atau apapun yang tidak menambah penghitung ID transaksi. -
Memanggil
txid_current()
kekuatan alokasi ID transaksi jika belum dialokasikan. Jadi transaksi read-only sekarang akan memiliki ID transaksi, yang sebelumnya tidak.
Tentu saja, txids juga dialokasikan di seluruh sesi. Dalam praktiknya, contoh Anda di atas mungkin mendapatkan txid dari a+1 dan a+429 jika database sedang sibuk.
Biasanya tidak bijaksana untuk menggunakan ID transaksi untuk apa pun di tingkat aplikasi. Khususnya:
Perlakukan xmin
dan xmax
sebagai bidang level sistem internal, dan perlakukan hasil txid_current()
sebagai nilai numerik yang tidak berarti.
Detail tentang penggunaan xids yang benar dan salah
Khususnya Anda tidak boleh:
- Bandingkan xid dengan nilai numerik untuk menarik kesimpulan apa pun tentang urutannya;
- Menambahkan atau mengurangi ID transaksi;
- Urutkan ID transaksi;
- Menambahkan atau mengurangi ID transaksi
- Bandingkan
xid
32-bit bidang yang diketik denganbigint
64-bit xid diperpanjang zaman, bahkan untuk kesetaraan.
Jadi dari perspektif aplikasi xids tidak monoton atau ordinal.
Anda bisa aman:
- bandingkan dua xid 64-bit epoch-extended untuk kesetaraan atau ketidaksetaraan; dan
- teruskan xids ke
txid_status(...)
dan fungsi lain yang didokumentasikan sebagai mengambil xid
Hati-hati:PostgreSQL menggunakan xid sempit 32-bit seperti xid
type, dan xids epoch-extended 64-bit biasanya direpresentasikan sebagai bigint
seperti yang dikembalikan oleh txid_current()
. Membandingkan ini untuk kesetaraan umumnya akan tampak berfungsi pada instalasi basis data baru, tetapi begitu sampul Epoch pertama telah terjadi dan mereka tidak lagi sama. Pg bahkan tidak memberi Anda cara mudah untuk melihat zaman xid di tingkat SQL; Anda harus:
select (txid_current() >> 32) AS xid_epoch;
untuk mendapatkan 32 bit teratas dari xid epoch-extended yang dilaporkan oleh txid_current()
.
Jadi ... apa pun yang Anda coba lakukan, kemungkinan ID transaksi bukan cara yang tepat untuk melakukannya.