PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come funziona Transaction_timestamp() in PostgreSQL

In PostgreSQL, il transaction_timestamp() La funzione restituisce la data e l'ora correnti (incluso l'offset del fuso orario), all'inizio della transazione corrente.

È l'equivalente della tradizionale funzione Postgres now() .

È anche simile a current_timestamp funzione (quando chiamato senza un argomento), tranne per il fatto che ha un nome per riflettere chiaramente ciò che fa.

Il transaction_timestamp() la funzione non accetta alcun parametro, quindi non puoi specificarne la precisione, mentre current_timestamp può essere chiamato con o senza un parametro di precisione.

Inoltre, transaction_timestamp() è una funzione non standard SQL.

Sintassi

La sintassi è questa:

transaction_timestamp()

Nessun argomento è richiesto o accettato.

Esempio di base

Ecco un esempio di base da dimostrare.

SELECT transaction_timestamp();

Risultato:

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

All'interno di una transazione

Ecco un esempio per dimostrare come funziona all'interno di una transazione.

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

Ecco l'output completo all'interno del mio terminale quando si utilizza 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

Tutti e tre i valori temporali sono identici, anche se pg_sleep() è stata utilizzata per ritardare l'esecuzione tra ogni chiamata a transaction_timestamp() , ognuno dei quali si trovava nella propria istruzione SQL.

Quindi possiamo vedere che il tempo restituito per ogni istruzione si basa sull'ora di inizio della transazione corrente, non sull'istruzione. Non cambia con l'avanzamento della transazione.

Ciò consente a una singola transazione di avere una nozione coerente dell'ora "corrente", in modo che più modifiche all'interno della stessa transazione abbiano lo stesso timestamp.

Più chiamate all'interno di un estratto conto

Inoltre, non cambia man mano che l'istruzione avanza.

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

Risultato (usando l'output verticale):

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

Anche in questo caso, tutti e tre i valori temporali sono identici, anche se pg_sleep() è stata utilizzata per ritardare l'esecuzione tra ogni chiamata a transaction_timestamp() .

Questo è in contrasto con statement_timestamp() , che fa cambia con ogni istruzione e anche clock_timestamp() funzione, che cambia anche mentre avanza attraverso ogni istruzione (se chiamata più volte all'interno dell'istruzione).