Bên cạnh các cột thông thường, các bảng Postgres cũng có sẵn các cột hệ thống khác nhau . Một trong số đó, xmin
lưu trữ ID giao dịch được sử dụng để tạo một hàng. Kiểu dữ liệu của nó là xid
, một số nguyên bốn byte bao bọc xung quanh tại một số điểm (nghĩa là không nhất thiết phải là duy nhất). Lần txid_current()
lượt, hàm trả về ID giao dịch hiện tại, nhưng vì bigint
, vì nó "được mở rộng với bộ đếm" epoch "nên nó sẽ không bao quanh trong suốt thời gian cài đặt" (để trích dẫn thủ công ).
Nếu kết thúc giao dịch chưa xảy ra, cả hai giá trị dường như khớp với nhau:
# CREATE TABLE test (label text);
CREATE TABLE
# INSERT INTO test VALUES ('test') RETURNING txid_current();
txid_current
--------------
674500
(1 row)
INSERT 0 1
# SELECT xmin FROM test;
xmin
--------
674500
(1 row)
Nhưng tôi tự hỏi: hai giá trị này luôn luôn có thể so sánh? Theo tôi hiểu, txid_current()
sẽ tiếp tục phân phối các giá trị duy nhất sau khi hoàn thành ID giao dịch (nhiều nhất là 2 ^ 32 giao dịch) và xmin
sẽ bắt đầu từ số không. Điều này có nghĩa là cả hai bắt đầu trả về các giá trị khác nhau tại thời điểm đó?
Và nếu điều này là đúng, là có một cách để trích xuất thông thường xid
của một txid_current()
kết quả để nó sẽ phù hợp với xmin
các mục trong một bảng (ví dụ như đúc txid_current()
để nguyên)?
Chỉnh sửa : Làm rõ hơn rằng tôi quan tâm đến những gì xảy ra sau khi kết thúc ID giao dịch, điều này rất có thể xảy ra lâu trước 2 ^ 32 giao dịch. Cảm ơn Daniel Vérité đã lưu ý điều này trong các bình luận.
xmin
trở nên đóng băng, câu hỏi vẫn đứng vững như thế nào mới hơn (thông thường) xmin
so với sau đó được thực hiện txid_current()
.
VACUUM FREEZE
và ghi đè lên cácxmin
hàng dài trước thời hạn 2 ^ 32. Kiểm tra Đóng băng Tuples của bạn để biết tổng quan về chủ đề này.