Đặt một giao dịch xung quanh hai truy vấn và sử dụng FOR UPDATE
trong tùy chọn SELECT
truy vấn để khóa các hàng mà nó đã kiểm tra. Bất kỳ kết nối nào khác cố gắng đọc hàng đó sẽ bị tạm ngưng cho đến khi giao dịch được cam kết.
Đảm bảo rằng bạn có chỉ mục trên các cột bạn kiểm tra trong WHERE
, vì vậy nó sẽ không phải quét và khóa tất cả các hàng mà nó đã kiểm tra trước khi tìm thấy hàng mà bạn muốn.
START TRANSACTION;
SELECT @id := `id`,`item`
FROM `queue_items`
WHERE `processed_at` IS NULL AND `completed_at` IS NULL
ORDER BY `id` ASC
LIMIT 1
FOR UPDATE;
UPDATE `queue_items` SET `processed_at` = @processedAt WHERE `id` = @id
COMMIT;