Klíčové body, kterým je třeba porozumět:
-
Vše je v transakci. Pokud jej explicitně nevytvoříte pomocí
BEGIN
aCOMMIT
(neboROLLBACK
) jeden je vytvořen právě pro tento výrok. -
Pouze pro čtení
SELECT
nezí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é
xid
zadané pole s 64bitovýmbigint
epoch-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.