Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Bloquear a linha de seleção do MySQL até que UPDATE tenha sido executado nela?


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;