Legen Sie eine Transaktion um die beiden Abfragen und verwenden Sie FOR UPDATE
Option in SELECT
Abfrage, um die untersuchten Zeilen zu sperren. Jede andere Verbindung, die versucht, diese Zeile zu lesen, wird ausgesetzt, bis die Transaktion festgeschrieben ist.
Stellen Sie sicher, dass Sie einen Index für die Spalten haben, die Sie in WHERE
testen -Klausel, sodass es nicht alle überprüften Zeilen scannen und sperren muss, bevor es die gewünschte findet.
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;