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).