sql >> Base de Datos >  >> RDS >> Mysql

¿Bloquear la fila de selección de MySQL hasta que se haya ejecutado la ACTUALIZACIÓN en ella?

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;