Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Auswahlzeile sperren, bis UPDATE darauf ausgeführt wurde?

Legen Sie eine Transaktion um die beiden Abfragen und verwenden Sie FOR UPDATE Option in SELECT Abfrage, um die untersuchten Zeilen zu sperren. Jede andere Verbindung, die versucht, diese Zeile zu lesen, wird ausgesetzt, bis die Transaktion festgeschrieben ist.

Stellen Sie sicher, dass Sie einen Index für die Spalten haben, die Sie in WHERE testen -Klausel, sodass es nicht alle überprüften Zeilen scannen und sperren muss, bevor es die gewünschte findet.

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;