Coloque una transacción alrededor de las dos consultas y use FOR UPDATE
opción en el SELECT
consulta para bloquear las filas que examinó. Cualquier otra conexión que intente leer esa fila se suspenderá hasta que se confirme la transacción.
Asegúrese de tener un índice en las columnas que prueba en WHERE
cláusula, por lo que no tendrá que hacer un escaneo y bloquear todas las filas que verificó antes de encontrar la que desea.
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;