Wichtige Punkte zum Verständnis:
-
Alles befindet sich in einer Transaktion. Wenn Sie nicht explizit eine mit
BEGIN
erstellen undCOMMIT
(oderROLLBACK
) 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-Bitbigint
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.