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

Minimales Beispiel für die Verwendung von select... for update zum Isolieren von Zeilen

SELECT ... FOR UPDATE sperrt die Zeile(n) im exklusiven Modus, was bedeutet, dass die zweite Auswahl nicht fortgesetzt werden kann, bis die erste abgeschlossen oder zurückgesetzt wurde. Dies liegt daran, dass das Ergebnis der zweiten Auswahl durch den Inhalt der Zeile, die Sie gesperrt haben, beeinflusst werden könnte, so dass es eine Lesesperre für die zu prüfende Zeile erhalten muss.

Wenn Sie einen UNIQUE INDEX erstellen auf zum Beispiel id , könnten Sie tun;

select * from SolrCoresPreallocated where id=1 for update;

in der ersten Transaktion und;

select * from SolrCoresPreallocated where id=2 for update;

in der zweiten unabhängig, da der eindeutige Index es der zweiten Auswahl ermöglicht, die richtige Zeile zu finden, ohne die erste lesezusperren.

BEARBEITEN:Um so schnell wie möglich eine "freie" Zeile zu erhalten, besteht die einzige Möglichkeit wirklich darin, zwei Transaktionen durchzuführen;

  • BEGIN/SELECT FOR UPDATE/UPDATE to busy/COMMIT, um die Zeile zu erhalten.
  • BEGIN//UPDATE zum Freigeben/COMMIT zum Verarbeiten und Freigeben der Zeile.

Dies bedeutet, dass Sie möglicherweise kompensierende Maßnahmen benötigen, falls ein Prozess fehlschlägt und die Transaktion, die die Zeile AKTUALISIEREN würde, zurücksetzt, um sie frei zu machen, aber da MySQL (oder Standard-SQL) nicht die Vorstellung hat, „die nächste entsperrte Zeile zu erhalten ", haben Sie nicht viele Möglichkeiten.