PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Atomowo ustaw wartość SERIAL podczas zatwierdzania transakcji

Postgres 9,5 wprowadził nową funkcję związaną z tym problemem:commit timestamps .

Wystarczy aktywować track_commit_timestamp w postgresql.conf (i uruchom ponownie!), aby rozpocząć śledzenie znaczników czasu zatwierdzenia. Następnie możesz zapytać:

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

Przeczytaj rozdział "Zatwierdź śledzenie znacznika czasu" w Postgres Wiki.
Powiązane narzędzie funkcje w instrukcji .

Zmienność funkcji jest tylko VOLATILE ponieważ identyfikatory transakcji (xid ) można zawijać zgodnie z definicją. Więc nie możesz utworzyć funkcjonalnego indeksu na nim.
Możesz sfałszować IMMUTABLE zmienność w opakowaniu funkcji dla aplikacji w ograniczonym czasie, ale musisz mieć świadomość konsekwencji. Powiązany przypadek z dodatkowym wyjaśnieniem:

W wielu przypadkach użycia (takich jak twój?), które są zainteresowane tylko sekwencją zatwierdzeń (a nie czasem bezwzględnym), bardziej wydajna może być praca z xmin rzutuj na bigint „bezpośrednio” (xmin::text::bigint ) zamiast sygnatur czasowych zatwierdzenia. (xid jest wewnętrznie liczbą całkowitą bez znaku, górna połowa, która nie mieści się w integer ze znakiem .) Ponownie, pamiętaj o ograniczeniach związanych z możliwym zawijaniem xid.

Z tego samego powodu znaczniki czasu zatwierdzenia nie są zachowywane w nieskończoność . W przypadku małych i średnich baz danych xid zawijanie prawie nigdy się nie zdarza — ale w końcu tak się stanie, jeśli klaster będzie działał wystarczająco długo. Przeczytaj rozdział "Zapobieganie błędom owijania identyfikatora transakcji" w instrukcji, aby uzyskać szczegółowe informacje.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gotcha do logicznej replikacji PostgreSQL

  2. Python + PostgreSQL + dziwne ascii =błąd kodowania UTF8

  3. Kompilacja libpq z iOS SDK 4.2

  4. PGError:Błąd:kolumna relacji nie istnieje

  5. Jak wstawić takie rzeczy jak now() -interval '2 minutes' do zapytania PHP PDO?