So handhaben Sie gleichzeitige Aktualisierungen von MySQL-Daten

So handhaben Sie gleichzeitige Aktualisierungen von MySQL-Daten

Wird UPDATE gesperrt?

Wird die SQL-Anweisung gesperrt, wenn sie wie folgt lautet?

UPDATE Tabelle1 SET Num = Num + 1 WHERE id=1;

Die Antwort ist nein

Tatsächlich unterstützt MySQL das Sperren von Datenzeilen (InnoDB) und fügt während UPDATE/DELETE-Vorgängen automatisch exklusive Sperren hinzu. Allerdings werden nicht alle Sperren angewendet, solange ein UPDATE-Schlüsselwort vorhanden ist . Für die obige MySQL-Anweisung ist es nicht nur eine UPDATE-Anweisung, sondern sollte zwei SQL-Anweisungen ähneln (Pseudocode):

a = AUSWÄHLEN * AUS Tabelle1 WO id=1;
UPDATE Tabelle1 SET Num = a.num + 1 WHERE id=1;

Beim Ausführen einer SELECT-Anweisung erfolgt keine Sperre, nur beim Ausführen eines UPDATE wird eine Sperre vorgenommen. Daher kommt es bei gleichzeitigen Vorgängen zu inkonsistenten Aktualisierungsdaten. Ist die Ursache gefunden, ist die Lösung des Problems nicht mehr weit. Es gibt zwei Möglichkeiten, diese Art von Problem zu lösen:

  • SELECT explizit über Transaktionen sperren
  • Verwenden Sie einen optimistischen Sperrmechanismus

SELECT explizit

Es gibt zwei Möglichkeiten, SELECT zu sperren:

SELECT ... LOCK IN SHARE MODE #Gemeinsame Sperre, andere Transaktionen können lesen, aber nicht aktualisieren SELECT ... FOR UPDATE #Exklusive Sperre, andere Transaktionen können weder lesen noch schreiben

Wenn Sie diese beiden Anweisungen nicht verwenden, wird die SELECT-Anweisung standardmäßig nicht gesperrt. Und für die oben genannten Szenarien müssen exklusive Sperren verwendet werden. Darüber hinaus sind die beiden oben genannten Aussagen nur innerhalb einer Transaktion wirksam, da sie sonst keine Wirkung entfalten. So verwenden Sie Transaktionen in der MySQL-Befehlszeile:

AUTOCOMMIT SETZEN=0; 
MIT DER ARBEIT BEGINNEN; 
 a = SELECT num FROM table1 WHERE id=2 FOR UPDATE; 
 UPDATE Tabelle1 SET Num = a.num + 1 WHERE id=2; 
ARBEIT VERPFLICHTEN;

Auf diese Weise verwenden Sie bei zukünftigen Datenaktualisierungen diese Transaktion zum Ausführen des Vorgangs. Im Falle einer Parallelität wird die später ausgeführte Transaktion blockiert, bis die aktuelle Transaktion abgeschlossen ist. (Parallelität wird durch Sperren in sequentielle Ausführung geändert)

Verwenden optimistischer Sperren

Optimistisches Sperren ist ein Mechanismus zur Sperrimplementierung, der naiv davon ausgeht, dass bei allen zu ändernden Daten keine Konflikte auftreten. Daher werden die Daten vor der Aktualisierung nicht gesperrt, sondern es wird nur die Versionsnummer der Datenzeile abgefragt (die Versionsnummer ist hier ein benutzerdefiniertes Feld, für das basierend auf der Geschäftstabelle ein zusätzliches Feld hinzugefügt werden muss, und es wird bei jeder Aktualisierung automatisch erhöht oder aktualisiert).

Bei einer Datenaktualisierung werden den Aktualisierungsbedingungen Informationen zur Versionsnummer hinzugefügt.

  • Wenn sich die Versionsnummer nicht ändert, bedeutet dies, dass die Datenzeile nicht aktualisiert wurde und die Aktualisierungsbedingungen erfüllt sind, sodass die Aktualisierung erfolgreich ist.
  • Wenn sich die Versionsnummer ändert, kann die Datenzeile nicht aktualisiert werden, da die Bedingung nicht erfüllt ist. Zu diesem Zeitpunkt ist ein SQL-Vorgang erforderlich. (Datensatzzeile erneut abfragen und Daten mit der neuen Versionsnummer noch einmal aktualisieren)

üben

Üben Sie die Updatesperre einmal an einer Schülertabelle, die eine Datenmenge enthält.

Öffnen Sie zwei Clients

Ausgeführt nach der ersten offenen Transaktion

Wählen Sie zum Aktualisieren den Namen des Studenten mit der ID = 1 aus. 

Nachdem die zweite Transaktion geöffnet wurde, wird dieselbe Anweisung ausgeführt und es wird festgestellt, dass die Daten durch die erste Transaktion blockiert sind.

Zu diesem Zeitpunkt führt die erste Transaktion die Änderung aus und führt ein Commit durch.

Die ausgewählte Ausführung der zweiten Transaktion war länger als 4 Sekunden blockiert

Zusammenfassung

Im Allgemeinen können beide Methoden gleichzeitige Aktualisierungsvorgänge an der Datenbank unterstützen. Welche Methode verwendet wird, hängt jedoch vom tatsächlichen Anwendungsszenario ab und davon, welche Methode das Anwendungsszenario besser unterstützt und die geringsten Auswirkungen auf die Leistung hat.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Ein praktischer Bericht über die Prüfung und Bearbeitung doppelter MySQL-Datensätze vor Ort
  • MySQLs Methode zum Umgang mit doppelten Daten (Verhindern und Löschen)
  • MySQL-Lernnotizen zum Umgang mit doppelten Daten
  • Detaillierte Erläuterung des MySQL-Ausführungsprinzips, der logischen Schichtung und der Änderung der Datenbankverarbeitungs-Engine
  • Einige Methoden zur Optimierung der Abfragegeschwindigkeit bei der Verarbeitung großer Datenmengen durch MySQL
  • Sortieren der MySQL-Datenverarbeitung und Erläuterung der Vorgänge zum Hinzufügen, Löschen und Ändern

<<:  Zabbix3.4-Methode zum Überwachen des MongoDB-Datenbankstatus

>>:  Routing-Wiederverwendungsfunktion für mehrere Tabs der Ant Design Blazor-Komponentenbibliothek

Artikel empfehlen

Beispiel für das Einfügen eines HTML-Bilds (html add image)

Zum Einfügen von Bildern in HTML sind HTML-Tags f...

Implementierung von Nginx-Weiterleitungsübereinstimmungsregeln

1. Regulärer Ausdrucksabgleich ~ für Groß- und Kl...

js, um einen Karusselleffekt zu erzeugen

Ich denke, das Karussell ist ein relativ wichtige...

Zusammenfassung zur Verwendung von HTML-Meta-Tags (empfohlen)

Meta-Tag-Funktion Der META-Tag ist ein Schlüsselt...

js-Objekt, um einen Daten-Paging-Effekt zu erzielen

In diesem Artikelbeispiel wird der spezifische Co...

Eine kurze Diskussion über die Semantik von HTML und einige einfache Optimierungen

1. Was ist Semantisierung? Erklärung zum Bing-Wör...

Der gesamte Prozess der Installation von mysql5.7.22 unter der ARM64-Architektur

MySQL-Download-Adresse: https://obs.cn-north-4.my...

Vue realisiert den Fortschrittsbalken-Änderungseffekt

Dieser Artikel verwendet Vue, um einfach die Ände...

MySQL-Anweisungsanordnung und zusammenfassende Einführung

SQL-Anweisungen (Structured Query Language), also...

Docker erstellt Cluster-MongoDB-Implementierungsschritte

Vorwort Aufgrund der Geschäftsanforderungen des U...