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

wie man einige Zeilen sperrt, da sie in anderen Transaktionen nicht ausgewählt werden

Es hört sich so an, als ob Sie eine Art Marker benötigen, um Zeilen als "in Verwendung" zu identifizieren, damit die anderen Instanzen nicht dieselben Daten verarbeiten. ob Sie einen booleschen oder einen Datumstyp verwenden, ist irrelevant, irgendwie müssen Sie die verwendeten Zeilen markieren.

Sie können dies entweder über einen Dispatcher, einen Prozess oder Thread mit alleinigem Zugriff auf Ihre Tabelle tun, dessen einzige Aufgabe darin besteht, Zeilen auszuwählen und sie an andere Prozesse zur Bearbeitung weiterzuleiten. Selbst dann muss der Dispatcher wissen, wie weit er mit den Daten gekommen ist, damit Sie wieder dasselbe Problem haben.

Eine andere Möglichkeit besteht darin, ein Feld zu verwenden, um anzuzeigen, dass die Zeile verwendet wird (wie Sie in Ihrer Frage gesagt haben). Jeder Prozess aktualisiert einen Zeilenblock mit einer eindeutigen ID, die innerhalb einer Transaktion ausgeführt wird, um die Tabelle zu sperren; Ich würde die von CONNECTION_ID() zurückgegebene Verbindungsnummer verwenden um sie zu markieren, dann wissen Sie, dass es einzigartig ist.

Nach dem UPDATE ... WHERE connection_id IS NULL (mit einem angewendeten Limit) Transaktion abgeschlossen ist, kann der Prozess SELECT ... WHERE connection_id = CONNECTION_ID() um ihre Zeilen zur Verarbeitung zu erhalten.

Wenn sie ihre Arbeit beendet haben, beginnt der gesamte Zyklus erneut, um die nächste Reihe von Zeilen zu markieren, bis alle verarbeitet wurden.