PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So interpretieren Sie den Wert von PosgreSQL txid_current()

Wichtige Punkte zum Verständnis:

  • Alles befindet sich in einer Transaktion. Wenn Sie nicht explizit eine mit BEGIN erstellen und COMMIT (oder ROLLBACK ) wird nur für diese Anweisung für Sie erstellt.

  • Nur-Lesen SELECT s erhalten keine vollständige Transaktions-ID, sie erhalten nur eine virtuelle Transaktions-ID. Also, obwohl es eine Transaktion ist, SELECT 1; oder was auch immer den Transaktions-ID-Zähler nicht erhöht.

  • Aufruf von txid_current() Kräfte die Zuweisung einer Transaktions-ID, falls noch keine zugewiesen wurde. Daher wird eine schreibgeschützte Transaktion jetzt eine Transaktions-ID haben, wo dies zuvor nicht der Fall war.

Natürlich werden txids auch Session-übergreifend vergeben. In der Praxis könnte Ihr obiges Beispiel txids von a+1 und a+429 erhalten, wenn die Datenbank ausgelastet ist.

Es ist im Allgemeinen nicht ratsam, die Transaktions-ID für irgendetwas auf Anwendungsebene zu verwenden. Insbesondere:

Behandle xmin und xmax als interne Felder auf Systemebene und behandeln das Ergebnis von txid_current() als bedeutungsloser numerischer Wert.

Details zur korrekten und falschen Verwendung von xids

Insbesondere sollten Sie niemals:

  • Vergleichen Sie xids anhand ihres numerischen Werts, um irgendwelche Schlüsse über ihre Reihenfolge zu ziehen;
  • Transaktions-IDs hinzufügen oder abziehen;
  • Transaktions-IDs sortieren;
  • Transaktions-IDs erhöhen oder verringern
  • Vergleichen Sie eine 32-Bit-xid typisiertes Feld mit einem 64-Bit bigint epochenerweitertes xid, sogar für Gleichheit.

Aus Anwendungssicht sind xids also weder monoton noch ordinal.

Sie können sicher:

  • zwei epochal-erweiterte 64-Bit-xids auf Gleichheit oder Ungleichheit vergleichen; und
  • xids an txid_status(...) übergeben und andere Funktionen, die als xid dokumentiert sind

Achtung:PostgreSQL verwendet schmale 32-Bit-xids wie xid -Typ und 64-Bit-Epochen-erweiterte xids, die typischerweise als bigint dargestellt werden wie die von txid_current() zurückgegebenen . Der Vergleich dieser auf Gleichheit scheint im Allgemeinen bei einer neuen Datenbankinstallation zu funktionieren, aber sobald der erste Epochen-Wraparound aufgetreten ist, sind sie nicht mehr gleich. Pg bietet Ihnen nicht einmal eine einfache Möglichkeit, die xid-Epoche auf SQL-Ebene zu sehen; Sie müssen:

select (txid_current() >> 32) AS xid_epoch;

um die oberen 32 Bits der epochal erweiterten xid zu erhalten, die von txid_current() gemeldet wird .

Also ... was auch immer Sie zu tun versuchen, es ist wahrscheinlich, dass die Transaktions-ID nicht der richtige Weg ist, es zu tun.