SELECT ... FOR UPDATE
khóa (các) hàng ở chế độ độc quyền, có nghĩa là lựa chọn thứ hai không thể tiếp tục cho đến khi lựa chọn đầu tiên hoàn thành hoặc quay trở lại. Điều này là do kết quả của lựa chọn thứ hai có thể bị ảnh hưởng bởi nội dung của hàng bạn đã khóa, vì vậy nó cần phải có khóa đọc cho hàng để kiểm tra.
Nếu bạn tạo một UNIQUE INDEX
trên ví dụ id
, bạn có thể làm;
select * from SolrCoresPreallocated where id=1 for update;
trong giao dịch đầu tiên và;
select * from SolrCoresPreallocated where id=2 for update;
trong thứ hai một cách độc lập, vì chỉ mục duy nhất cho phép lựa chọn thứ hai tìm thấy hàng chính xác mà không cần đọc khóa hàng đầu tiên.
CHỈNH SỬA:Để có hàng "miễn phí" nhanh nhất có thể, cách duy nhất thực sự là thực hiện hai giao dịch;
- BẮT ĐẦU / CHỌN CẬP NHẬT / CẬP NHẬT thành bận / CAM KẾT để nhận hàng.
- BẮT ĐẦU /
/ UPDATE để miễn phí / CAM KẾT xử lý hàng và giải phóng nó.
Điều này có nghĩa là bạn có thể cần các hành động bù đắp trong trường hợp một quy trình không thành công và quay trở lại giao dịch sẽ CẬP NHẬT hàng để giải phóng, nhưng vì MySQL (hoặc SQL tiêu chuẩn cho vấn đề đó) không có khái niệm "lấy hàng được mở khóa tiếp theo ", bạn không có nhiều lựa chọn.