PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana menginterpretasikan nilai PosgreSQL txid_current()

Poin-poin penting untuk dipahami:

  • Semuanya sedang dalam suatu transaksi. Jika Anda tidak membuatnya secara eksplisit dengan BEGIN dan COMMIT (atau ROLLBACK ) 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 dengan bigint 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hal-Hal Utama yang Harus Dipantau di PostgreSQL - Menganalisis Beban Kerja Anda

  2. Mengapa PostgreSQL tidak mengembalikan nilai nol ketika kondisinya <> true

  3. Cara Mengubah Pengguna menjadi Pengguna Super di PostgreSQL

  4. Cara Membuat Tabel Hanya jika Tidak Ada di PostgreSQL

  5. psycopg2 bagaimana menangani TypeError:tidak semua argumen dikonversi selama pemformatan string