Câu hỏi của bạn, tham chiếu đến một nguồn không xác định:
Tôi đã xem xét việc khóa hàng, nhưng nó cho biết bạn không thể ngăn các trạng thái lựa chọn có vẻ như nó sẽ không hoạt động đối với tình trạng của tôi ở đây. Có phải lựa chọn duy nhất của tôi để sử dụng khóa tư vấn không?
Tài liệu chính thức về vấn đề này:
Khóa cấp hàng không ảnh hưởng đến truy vấn dữ liệu; họ chỉ chặn nhà văn và tủ khóa vào cùng một hàng.
Các lần thử đồng thời sẽ không chỉ chọn mà còn cố gắng thực hiện cùng một khóa cấp hàng với SELECT ... FOR UPDATE
- khiến họ phải đợi bất kỳ giao dịch nào trước đó đang giữ khóa trên cùng một hàng để cam kết hoặc quay trở lại. Đúng như những gì bạn muốn.
Tuy nhiên , nhiều trường hợp sử dụng được giải quyết tốt hơn với khóa tư vấn - trong các phiên bản trước 9.5. Bạn vẫn có thể khóa các hàng đang được xử lý bằng FOR UPDATE
bổ sung để được an toàn. Nhưng nếu giao dịch tiếp theo chỉ muốn xử lý "hàng miễn phí tiếp theo" thì thường là nhiều hiệu quả hơn là không phải đợi cùng một hàng, điều này gần như chắc chắn không có sau khi khóa được phát hành, nhưng hãy chuyển sang "miễn phí tiếp theo" ngay lập tức.
Trong Postgres 9.5+, hãy xem xét FOR UPDATE SKIP LOCKED
cho điều này. Giống như @Craig đã nhận xét, điều này có thể thay thế phần lớn các khóa tư vấn.
Câu hỏi liên quan vấp phải cùng một hiệu suất heo:
- Hàm thực hiện mãi mãi để chạy cho một số lượng lớn các bản ghi
Giải thích và ví dụ về mã cho các khóa tư vấn hoặc FOR UPDATE SKIP LOCKED
trong Postgres 9.5+:
- CẬP NHẬT Postgres ... LIMIT 1
Để khóa nhiều hàng cùng một lúc :
- Cách đánh dấu nr hàng nhất định trong bảng khi truy cập đồng thời