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

mysql - Sperren von Zeilen für ausgewählte Abfrage?

Die systemeigene MySQL-Sperre bietet diese Funktionalität nicht. Sie könnten eine Spalte verwenden, um Ihre "Sperren" auszuführen.

Unter der Annahme, dass jeder Thread eine eindeutige ID hat, könnten Sie eine Spalte mit dem Namen thread_owner erstellen , mit Standardwert 0.

Ein Thread würde eine Zeile wie diese erfassen:

UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1

Wählen Sie dann die Zeile wie folgt aus (es könnte none zurückgeben, wenn es keine zu verarbeitenden Zeilen gäbe):

SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

Dann verarbeiten und schließlich löschen.

Diese Lösung würde sowohl auf MyISAM als auch auf InnoDB funktionieren.

Für InnoDB kann es jedoch langsam sein, da jede UPDATE-Anweisung versucht, alle Zeilen zu sperren, in denen thread_owner =0 ist, und wenn Sie nicht sicher sind, dass Sie alle Zeilen jedes Mal in derselben Reihenfolge sperren, könnte dies sogar zu einem Deadlock führen. Sie könnten also versuchen, die gesamte Tabelle explizit in Ihrer UPDATE-Anweisung zu sperren:

LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;

Auf diese Weise funktionieren sowohl MyISAM als auch InnoDB auf die gleiche Weise.