PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách giao dịch_timestamp () hoạt động trong PostgreSQL

Trong PostgreSQL, transaction_timestamp() hàm trả về ngày và giờ hiện tại (bao gồm cả độ lệch múi giờ), khi bắt đầu giao dịch hiện tại.

Nó tương đương với hàm Postgres truyền thống now() .

Nó cũng tương tự như current_timestamp hàm (khi được gọi mà không có đối số), ngoại trừ việc nó được đặt tên để phản ánh rõ ràng chức năng của nó.

transaction_timestamp() hàm không chấp nhận bất kỳ tham số nào, vì vậy bạn không thể chỉ định độ chính xác của nó, trong khi current_timestamp có thể được gọi có hoặc không có tham số chính xác.

Ngoài ra, transaction_timestamp() là một hàm không phải chuẩn SQL.

Cú pháp

Cú pháp như sau:

transaction_timestamp()

Không có đối số nào được yêu cầu hoặc chấp nhận.

Ví dụ cơ bản

Đây là một ví dụ cơ bản để chứng minh.

SELECT transaction_timestamp();

Kết quả:

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

Trong một giao dịch

Dưới đây là một ví dụ để chứng minh cách nó hoạt động trong một giao dịch.

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

Đây là đầu ra đầy đủ trong thiết bị đầu cuối của tôi khi sử dụng 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

Cả ba giá trị thời gian đều giống hệt nhau, mặc dù pg_sleep() hàm được sử dụng để trì hoãn việc thực thi giữa mỗi lần gọi đến transaction_timestamp() , mỗi câu lệnh trong số đó đều nằm trong câu lệnh SQL của riêng nó.

Vì vậy, chúng ta có thể thấy rằng thời gian trả về cho mỗi câu lệnh dựa trên thời gian bắt đầu của giao dịch hiện tại - không phải câu lệnh. Nó không thay đổi khi giao dịch tiến triển.

Điều này cho phép một giao dịch duy nhất có khái niệm nhất quán về thời gian “hiện tại”, do đó, nhiều sửa đổi trong cùng một giao dịch có cùng dấu thời gian.

Nhiều cuộc gọi trong một câu lệnh

Nó cũng không thay đổi khi câu lệnh diễn ra.

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

Kết quả (sử dụng đầu ra dọc):

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

Một lần nữa, cả ba giá trị thời gian đều giống hệt nhau, mặc dù pg_sleep() hàm được sử dụng để trì hoãn việc thực thi giữa mỗi lần gọi đến transaction_timestamp() .

Điều này trái ngược với statement_timestamp() , mà hiện thay đổi theo từng câu lệnh và cả clock_timestamp() hàm, thay đổi ngay cả khi nó tiến triển qua mỗi câu lệnh (nếu được gọi nhiều lần trong câu lệnh).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dự phòng &Dự phòng cho PostgreSQL trên Microsoft Azure

  2. Docker đợi cho postgresql đang chạy

  3. Cách tốt nhất để kiểm tra giá trị trống hoặc rỗng

  4. Nhiều cơ sở dữ liệu trong docker và docker-soạn

  5. Khóa cho CHỌN để một quy trình khác không lấy dữ liệu cũ