sql >> Databáze >  >> RDS >> PostgreSQL

Jak interpretovat hodnotu txid_current() PosgreSQL

Klíčové body, kterým je třeba porozumět:

  • Vše je v transakci. Pokud jej explicitně nevytvoříte pomocí BEGIN a COMMIT (nebo ROLLBACK ) 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ým bigint 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.




  1. Jak extrahovat rok a měsíc od data v PostgreSQL bez použití funkce to_char()?

  2. Jak rychle upravit hodnoty v tabulce v SQL Server Management Studio?

  3. Hibernate, id, oracle, sekvence

  4. Získejte prvních n záznamů pro každou skupinu seskupených výsledků