Làm cách nào để so sánh xmin và txid_cản () sau khi kết thúc ID giao dịch?


12

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ố đó, xminlư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à xminsẽ 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 xidcủa một txid_current()kết quả để nó sẽ phù hợp với xmincá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.


1
Bạn đang bỏ qua thực tế là hệ thống sẽ VACUUM FREEZEvà ghi đè lên các xminhà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.
Daniel Vérité

Đúng, tôi đã bỏ qua thực tế này, cảm ơn vì đã chỉ ra nó. Và thực sự đóng băng sẽ xảy ra lâu trước 2 ^ 32. Tuy nhiên, ngay cả khi cũ xmintrở 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) xminso với sau đó được thực hiện txid_current().
tomka

1
Điều đáng chú ý là PostgreSQL sẽ ngừng hoạt động nếu chỉ còn ít hơn 1 triệu giao dịch cho đến khi hoàn tất .
dùng103153

Câu trả lời:


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.