PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Funktionsweise von transaction_timestamp() in PostgreSQL

In PostgreSQL der transaction_timestamp() Die Funktion gibt das aktuelle Datum und die Uhrzeit (einschließlich des Zeitzonen-Offsets) zu Beginn der aktuellen Transaktion zurück.

Es ist das Äquivalent der traditionellen Postgres-Funktion now() .

Es ähnelt auch dem current_timestamp -Funktion (wenn sie ohne Argument aufgerufen wird), außer dass sie so benannt ist, dass sie klar widerspiegelt, was sie tut.

Der transaction_timestamp() Die Funktion akzeptiert keine Parameter, sodass Sie ihre Genauigkeit nicht angeben können, während current_timestamp kann mit oder ohne Genauigkeitsparameter aufgerufen werden.

Auch transaction_timestamp() ist eine Nicht-SQL-Standardfunktion.

Syntax

Die Syntax lautet wie folgt:

transaction_timestamp()

Es sind keine Argumente erforderlich oder akzeptiert.

Einfaches Beispiel

Hier ist ein einfaches Beispiel zur Veranschaulichung.

SELECT transaction_timestamp();

Ergebnis:

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

Innerhalb einer Transaktion

Hier ist ein Beispiel, um zu demonstrieren, wie es innerhalb einer Transaktion funktioniert.

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

Hier ist die vollständige Ausgabe in meinem Terminal bei Verwendung von 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

Alle drei Zeitwerte sind identisch, obwohl pg_sleep() Funktion wurde verwendet, um die Ausführung zwischen jedem Aufruf von transaction_timestamp() zu verzögern , die jeweils in einer eigenen SQL-Anweisung enthalten waren.

Wir können also sehen, dass die für jede Anweisung zurückgegebene Zeit auf der Startzeit der aktuellen Transaktion basiert – nicht auf der Anweisung. Es ändert sich nicht, während die Transaktion fortschreitet.

Dadurch kann eine einzelne Transaktion eine konsistente Vorstellung von der „aktuellen“ Zeit haben, sodass mehrere Änderungen innerhalb derselben Transaktion denselben Zeitstempel tragen.

Mehrere Aufrufe innerhalb einer Anweisung

Es ändert sich auch nicht, wenn die Anweisung fortschreitet.

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

Ergebnis (bei vertikaler Ausgabe):

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

Auch hier sind alle drei Zeitwerte identisch, obwohl pg_sleep() Funktion wurde verwendet, um die Ausführung zwischen jedem Aufruf von transaction_timestamp() zu verzögern .

Dies steht im Gegensatz zu statement_timestamp() , was macht ändern sich mit jeder Anweisung, und auch der clock_timestamp() -Funktion, die sich auch im Verlauf jeder Anweisung ändert (wenn sie innerhalb der Anweisung mehrmals aufgerufen wird).