Klíčové body, kterým je třeba porozumět:
-
Vše je v transakci. Pokud jej explicitně nevytvoříte pomocí
BEGINaCOMMIT(neboROLLBACK) jeden je vytvořen právě pro tento výrok. -
Pouze pro čtení
SELECTnezískají úplné ID transakce, získají pouze ID virtuální transakce. Takže i když se jedná o transakci,SELECT 1;nebo cokoli, co nezvýší počítadlo ID transakce. -
Volání
txid_current()síly přidělení ID transakce, pokud ještě nebylo přiděleno. Transakce pouze pro čtení tedy bude mít nyní ID transakce, kde dříve neměla.
Txid jsou samozřejmě také alokovány napříč relacemi. V praxi může váš příklad výše získat txid a+1 a a+429, pokud je databáze zaneprázdněná.
Obecně není moudré používat ID transakce pro cokoli na úrovni aplikace. Konkrétně:
Ošetřete xmin a xmax jako interní pole na úrovni systému a zacházet s výsledkem txid_current() jako nesmyslnou číselnou hodnotu.
Podrobnosti o správném a nesprávném použití xids
Zejména byste nikdy neměli:
- Porovnejte hodnoty xid podle číselné hodnoty, abyste mohli vyvodit jakýkoli závěr o jejich řazení;
- Přidat nebo odečíst ID transakcí;
- Třídit ID transakcí;
- Zvýšení nebo snížení ID transakcí
- Porovnejte 32bitové
xidzadané pole s 64bitovýmbigintepoch-extended xid, a to i pro rovnost.
Takže z hlediska aplikace nejsou xid ani monotónní, ani ordinální.
můžete bezpečně:
- porovnání dvou 64bitových epoch-extended xids pro rovnost nebo nerovnost; a
- předat xid do
txid_status(...)a další funkce zdokumentované jako převzetí xid
Pozor:PostgreSQL používá 32bitové úzké xid jako xid typ a 64bitové epoch-extended xids typicky reprezentované jako bigint jako ty, které vrací txid_current() . Porovnání těchto hodnot pro rovnost bude obecně vypadat, že bude fungovat na nové instalaci databáze, ale jakmile dojde k první epochě, nebudou si již rovny. Pg vám ani nenabízí snadný způsob, jak vidět epochu xid na úrovni SQL; musíte:
select (txid_current() >> 32) AS xid_epoch;
získat horních 32 bitů epoch-extended xid hlášené txid_current() .
Takže ... ať už se snažíte udělat cokoliv, je pravděpodobné, že ID transakce není správný způsob, jak to udělat.