V PostgreSQL, transaction_timestamp()
funkce vrací aktuální datum a čas (včetně posunu časového pásma) na začátku aktuální transakce.
Je to ekvivalent tradiční funkce Postgres now()
.
Je také podobný current_timestamp
funkce (když je volána bez argumentu), kromě toho, že je pojmenována tak, aby jasně odrážela, co dělá.
transaction_timestamp()
funkce nepřijímá žádné parametry, takže nemůžete určit její přesnost, zatímco current_timestamp
lze volat s parametrem přesnosti nebo bez něj.
Také transaction_timestamp()
je nestandardní funkce SQL.
Syntaxe
Syntaxe vypadá takto:
transaction_timestamp()
Nejsou vyžadovány ani přijímány žádné argumenty.
Základní příklad
Zde je základní příklad k demonstraci.
SELECT transaction_timestamp();
Výsledek:
2020-07-02 08:23:08.810484+10
V rámci transakce
Zde je příklad demonstrující, jak to funguje v rámci transakce.
BEGIN;
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
COMMIT;
Zde je úplný výstup v mém terminálu při použití 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
Všechny tři časové hodnoty jsou stejné, i když pg_sleep()
funkce byla použita ke zpoždění provedení mezi každým voláním transaction_timestamp()
, z nichž každý byl náhodou ve svém vlastním příkazu SQL.
Můžeme tedy vidět, že čas vrácený pro každý výpis je založen na počátečním čase aktuální transakce – nikoli na výpisu. V průběhu transakce se nemění.
To umožňuje, aby jedna transakce měla konzistentní představu o „aktuálním“ čase, takže více úprav v rámci stejné transakce nese stejný časový údaj.
Více hovorů v rámci výpisu
Nemění se ani v průběhu výpisu.
\x
SELECT
transaction_timestamp(),
pg_sleep(5),
transaction_timestamp(),
pg_sleep(5),
transaction_timestamp();
Výsledek (při použití vertikálního výstupu):
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
Opět platí, že všechny tři časové hodnoty jsou stejné, i když pg_sleep()
funkce byla použita ke zpoždění provedení mezi každým voláním transaction_timestamp()
.
To je v kontrastu s statement_timestamp()
, což dělá změnit s každým příkazem a také clock_timestamp()
funkce, která se mění, i když postupuje každým příkazem (pokud je v rámci příkazu volána vícekrát).