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

Atomicky nastavená hodnota SERIAL při provádění transakce

Postgres 9.5 představil novou funkci související s tímto problémem:časová razítka potvrzení .

Stačí si aktivovat track_commit_timestamp v postgresql.conf (a restartujte!), abyste mohli začít sledovat časová razítka odevzdání. Pak se můžete zeptat:

SELECT * FROM tbl
WHERE  pg_xact_commit_timestamp(xmin) >= '2015-11-26 18:00:00+01';

Přečtěte si kapitolu "Zavázat sledování časového razítka" na Postgres Wiki.
Související utilita funkce v příručce .

Volatilita funkce je pouze VOLATILE protože ID transakcí (xid ) může obtékat podle definice. Takže nemůžete vytvořit funkční index na něm.
Mohli byste předstírat IMMUTABLE volatilita v obalu funkcí pro aplikace v omezeném časovém rámci, ale musíte si být vědomi důsledků. Související případ s podrobnějším vysvětlením:

Pro mnoho případů použití (jako ten váš?), které se zajímají pouze o posloupnost potvrzení (a nikoli o absolutní čas), může být efektivnější pracovat s xmin přenést do bigint "přímo" (xmin::text::bigint ) místo časových razítek potvrzení. (xid je interně celé číslo bez znaménka, horní polovina se nevejde do integer se znaménkem .) Opět si uvědomte omezení kvůli možnému xid wraparound.

Ze stejného důvodu se časová razítka potvrzení neuchovávají na dobu neurčitou . Pro malé až střední databáze xid Obtékání se téměř nikdy nestane - ale nakonec se to stane, pokud je cluster dostatečně dlouho aktivní. Přečtěte si kapitolu „Prevence selhání obtékání ID transakce“ podrobnosti naleznete v příručce.




  1. Jak mohu použít LOAD_FILE k vložení hodnoty ze souboru do tabulky?

  2. SQL Server 2008 metody stránkování?

  3. mysql časový rozdíl na hodiny

  4. Jaké je použití hranatých závorek [] v příkazech SQL?