PostgreSQL tăng đồng thời của bộ đếm


9

Tôi cần duy trì một bảng thống kê cho một dự án, bao gồm một danh sách các mục và cách sử dụng chúng (Hãy nghĩ về một cái gì đó giống như một trang web mà bạn muốn đếm số lần xem trang). Mỗi khi một mục được kích hoạt, tôi cần tăng mức sử dụng của mục cụ thể.

Triển khai đầu tiên của tôi là:

statistics(
  id      integer NOT NULL,
  name    character varying(255) NOT NULL,
  usage   integer NOT NULL DEFAULT 0,
);


UPDATE statistics 
  SET usage = usage + 1
WHERE name = '<name>';

Mối quan tâm của tôi là về hiệu suất và đồng thời. Quá trình cập nhật sẽ được khởi tạo bởi vài chục (có thể 80-120) thiết bị và có thể xảy ra vài lần mỗi giây, vì vậy câu hỏi của tôi là:

1) phương pháp này sẽ bảo tồn đồng thời? (tức là nếu có nhiều hơn một thiết bị yêu cầu cập nhật "cùng một lúc", thì mọi yêu cầu có được tính không?)

2) bạn có thể đề xuất một cách tốt nhất để đạt được kết quả? Tôi hy vọng sẽ có tải bằng văn bản các bản cập nhật, trong khi các lần đọc sẽ giúp tôi thường xuyên hơn nhiều. Có tồn tại một chức năng cụ thể để tăng giá trị? Tôi đang xem "trình tự" nhưng tôi không chắc đó có phải là cách đúng không ...

Cảm ơn bạn rất nhiều vì lời khuyên

Câu trả lời:


5

Bản cập nhật thứ hai sẽ đợi bản cập nhật trước đó trên cùng một hàng được gửi, nhưng sau đó sẽ thấy giá trị đã cam kết.

Giả sử hai giao dịch đồng thời cập nhật cùng một hàng với giá trị ban đầu là 0

Chuyển đổi thời gian 1 giá trị T1 Giao dịch 2 giá trị T2
-------------------------------------------------- ------------
1 cập nhật ... 1 0
2 1 cập nhật .. "không xác định"
                                (chờ đợi) 
3 cam kết 1 2
4 1 cam kết 2
5 2 2 

"Giá trị T1" và "Giá trị T2" có nghĩa là giá trị mà giao dịch đó nhìn thấy.

Nếu bạn muốn đảm bảo rằng bạn nắm bắt được các tình huống có thay đổi "không tương thích" (ví dụ: một giao dịch đặt usagecột thành một giá trị cụ thể, thay vì chỉ tăng nó), bạn có thể đặt tất cả các giao dịch vào mức cô lập "tuần tự hóa". Nhưng bạn sẽ cần chuẩn bị để xử lý lỗi sau đó.

Cập nhật cho các tên khác nhau có thể chạy đồng thời mà không cần chờ đợi (vì các hàng khác nhau bị ảnh hưởng).

SELECTs sẽ không bao giờ bị chặn mà sẽ chỉ nhìn thấy các giá trị được ghi.

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.