Mysql
 sql >> Database >  >> RDS >> Mysql

Blocca la riga di selezione di MySQL fino a quando UPDATE non è stato eseguito su di essa?

Metti una transazione attorno alle due query e usa il FOR UPDATE opzione nel SELECT query per bloccare le righe esaminate. Qualsiasi altra connessione che tenti di leggere quella riga sarà sospesa fino al commit della transazione.

Assicurati di avere un indice sulle colonne che testi in WHERE clausola, quindi non dovrà eseguire una scansione e bloccare tutte le righe che ha controllato prima di trovare quella desiderata.

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;