Coloque uma transação em torno das duas consultas e use o
FOR UPDATE
opção no SELECT
query para bloquear as linhas que examinou. Qualquer outra conexão que tente ler essa linha será suspensa até que a transação seja confirmada. Certifique-se de ter um índice nas colunas que você testa no
WHERE
cláusula, para que ele não precise fazer uma varredura e bloquear todas as linhas verificadas antes de encontrar a que deseja. 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;