Sæt en transaktion omkring de to forespørgsler, og brug SELECT
forespørgsel for at låse de rækker, den undersøgte. Enhver anden forbindelse, der forsøger at læse den række, vil blive suspenderet, indtil transaktionen er begået.
Sørg for, at du har et indeks på de kolonner, du tester i WHERE
klausul, så den behøver ikke at scanne og låse alle de rækker, den har tjekket, før den finder den, du ønsker.
START TRANSACTION;SELECT @id :=`id`,`item` FRA `queue_items` HVOR `processed_at` ER NULL OG `completed_at` ER NULL ORDER BY `id` ASC LIMIT 1FOR UPDATE;OPDATERING `queue_items ` SET `processed_at` =@processedAt WHERE `id` =@idCOMMIT;