BEGIN;
LOCK TABLE slots IN ACCESS EXCLUSIVE MODE;
UPDATE slots SET job_name = '111' WHERE id IN (SELECT id FROM slots WHERE job_name IS NULL LIMIT 1) RETURNING *;
COMMIT;
Điều này dường như hoạt động trong Đã đọc cam kết. Nó chỉ là sql (giống như mã của bạn) và có thể được thực thi trong một lần gọi (nhanh hơn).
@Seth Robertson:Sẽ không an toàn nếu không có BẢNG KHÓA và không có vòng lặp while.
Nếu có giao dịch A và giao dịch B đồng thời:A sẽ chọn hàng đầu tiên và B sẽ chọn hàng đầu tiên. A sẽ khóa và cập nhật hàng, B phải đợi cho đến khi A cam kết. Sau đó B sẽ kiểm tra lại điều kiện job_name IS NULL. Nó sai và B sẽ không cập nhật - B sẽ không chọn hàng tiếp theo mà chỉ kiểm tra lại và trả về kết quả trống.
@joegester:CHỌN CẬP NHẬT không phải là vấn đề vì tất cả bảng đều bị khóa.
Có thể có một cách khác để thực hiện công việc - nếu bạn xóa và chèn các hàng (trong bảng khác?) Thay vì đặt NULL. Nhưng tôi không chắc làm thế nào.