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

Jak transaction_timestamp() działa w PostgreSQL

W PostgreSQL, transaction_timestamp() funkcja zwraca bieżącą datę i godzinę (wraz z przesunięciem strefy czasowej), na początku bieżącej transakcji.

Jest to odpowiednik tradycyjnej funkcji Postgresa now() .

Jest również podobny do current_timestamp funkcja (gdy wywołana bez argumentu), z wyjątkiem tego, że jej nazwa wyraźnie odzwierciedla to, co robi.

transaction_timestamp() funkcja nie przyjmuje żadnych parametrów, więc nie można określić jej precyzji, natomiast current_timestamp można wywołać z parametrem precyzji lub bez niego.

Ponadto transaction_timestamp() jest funkcją inną niż standardowa SQL.

Składnia

Składnia wygląda tak:

transaction_timestamp()

Żadne argumenty nie są wymagane ani akceptowane.

Przykład podstawowy

Oto podstawowy przykład do zademonstrowania.

SELECT transaction_timestamp();

Wynik:

2020-07-02 08:23:08.810484+10

W ramach transakcji

Oto przykład pokazujący, jak to działa w ramach transakcji.

BEGIN;
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
COMMIT;

Oto pełne dane wyjściowe w moim terminalu podczas korzystania z psql:

postgres=# BEGIN;
BEGIN
postgres=# SELECT transaction_timestamp();
     transaction_timestamp     
-------------------------------
 2020-07-02 08:27:04.229266+10
(1 row)


postgres=# SELECT pg_sleep(5);
 pg_sleep 
----------
 
(1 row)


postgres=# SELECT transaction_timestamp();
     transaction_timestamp     
-------------------------------
 2020-07-02 08:27:04.229266+10
(1 row)


postgres=# SELECT pg_sleep(5);
 pg_sleep 
----------
 
(1 row)


postgres=# SELECT transaction_timestamp();
     transaction_timestamp     
-------------------------------
 2020-07-02 08:27:04.229266+10
(1 row)


postgres=# COMMIT;
COMMIT

Wszystkie trzy wartości czasu są identyczne, mimo że pg_sleep() funkcja została użyta do opóźnienia wykonania między każdym wywołaniem transaction_timestamp() , z których każda znajdowała się we własnej instrukcji SQL.

Widzimy więc, że czas zwracany dla każdego wyciągu jest oparty na czasie rozpoczęcia bieżącej transakcji, a nie na wyciągu. Nie zmienia się wraz z postępem transakcji.

Dzięki temu pojedyncza transakcja ma spójne pojęcie „bieżącego” czasu, dzięki czemu wiele modyfikacji w ramach tej samej transakcji ma ten sam znacznik czasu.

Wiele połączeń w wyciągu

Nie zmienia się również w miarę postępów w oświadczeniu.

\x
SELECT 
  transaction_timestamp(),
  pg_sleep(5),
  transaction_timestamp(),
  pg_sleep(5),
  transaction_timestamp();

Wynik (przy użyciu wyjścia pionowego):

transaction_timestamp | 2020-07-02 09:15:56.154175+10
pg_sleep              | 
transaction_timestamp | 2020-07-02 09:15:56.154175+10
pg_sleep              | 
transaction_timestamp | 2020-07-02 09:15:56.154175+10

Ponownie, wszystkie trzy wartości czasu są identyczne, mimo że pg_sleep() funkcja została użyta do opóźnienia wykonania między każdym wywołaniem transaction_timestamp() .

Jest to w przeciwieństwie do statement_timestamp() , co robi zmienić z każdą instrukcją, a także clock_timestamp() funkcja, która zmienia się nawet w miarę przechodzenia przez każdą instrukcję (jeśli jest wywoływana wiele razy w obrębie instrukcji).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nieprawidłowa sekwencja bajtów do kodowania UTF8

  2. Wyrażenie regularne w klauzuli PostgreSQL LIKE

  3. Błąd aplikacji testowej django - Wystąpił błąd podczas tworzenia testowej bazy danych:odmowa uprawnień do utworzenia bazy danych

  4. Jak zatrzymać/zabić zapytanie w postgresql?

  5. Konfiguracja i użytkowanie pgmemcache