Fallanalyse mehrerer MySQL-Aktualisierungsvorgänge

Fallanalyse mehrerer MySQL-Aktualisierungsvorgänge

In diesem Artikel werden die Vor- und Nachteile verschiedener Datenaktualisierungsvorgänge anhand einer Fallstudie zur Aktualisierung des Kontostands eines Benutzerkontos analysiert. Ich hoffe, das hilft euch allen 🐶.

Datenbankversion: mysql 5.7.23

Fallstudie

DDL zum Erstellen einer Datenbank:

Tabelle „hw_account“ erstellen (
  `id` int(11) NICHT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `balance` int(11) DEFAULT NULL,
  `status` varchar(20) DEFAULT NULL,
  `create_time` datetime NICHT NULL STANDARD CURRENT_TIMESTAMP,
  `update_time` Zeitstempel NULL DEFAULT CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP,
  PRIMÄRSCHLÜSSEL (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

Kontostand aktualisieren

Direktes Update

Lösung 1: Update nach Abfrage

# Datenabfrage select * from hw_account where id = 1;

# Daten aktualisieren, hw_account aktualisieren, Guthaben festlegen = 5, wobei ID = 1;

Das Problem besteht darin, dass das Update verloren gehen kann, wenn der Vorgang in zwei Teile aufgeteilt und gleichzeitig ausgeführt wird.

Optimistisches Sperrschema

Verwenden Sie die Versionsnummernoperation, d. h. fügen Sie der Datenbank eine optimistische Sperre hinzu.

# Datenabfrage select * from hw_account where id = 1;

# Daten aktualisieren update hw_account set balance = 5 , version = version + 1 
  wobei ID = 1 und Version = n;
  
# Bestimmen Sie, ob es erfolgreich war, wenn Zeile < 1 {
   Rollback}

Das bestehende Problem besteht darin, dass andere Anfragen fehlschlagen, wenn dieses Datenelement gleichzeitig verarbeitet wird. Wenn der Front-End-Link dieser Anforderung relativ lang ist, sind die Rollback-Kosten relativ hoch.

Schlossfreie Lösung

Es ist keine Abfrage erforderlich, es wird eine Datenbankberechnung verwendet und es ist kein Versionsnummernvorgang erforderlich. Die Gültigkeit wird direkt anhand der Domänenwerte beurteilt. Das spezifische SQL lautet wie folgt:

# Daten aktualisieren update hw_account set balance = balance + @change_num , version = version + 1 
  wobei ID = 1 und Version = n;
  
# Bestimmen Sie, ob es erfolgreich war, wenn Zeile < 1 {
   Rollback}

Diese Lösung lässt sich zwar relativ einfach modifizieren, basiert jedoch auf Datenberechnungen und ist nicht besonders benutzerfreundlich.

Warteschlangenvorgänge

Datenanforderungen werden über die verteilten Sperren von Redis oder ZK in die Warteschlange gestellt. Aktualisieren Sie anschließend die Daten.

# Pseudocode if (verteilte Sperre abrufen) {
  Aktualisiere hw_account, setze Guthaben = @balance, wobei ID = 1;
} anders {
  # Warten eingeben oder drehen, um die Sperre zu erhalten}

Häufig gestellte Fragen

Wenn das Feld „update_time“ in den Daten vorhanden ist, wie viele Zeilen sind betroffen?

Das Feld update_time wird wie folgt definiert. Wenn die Daten id = 1, status = 1 sind und die SQL-Anweisung zum Aktualisieren der Daten lautet

Aktualisiere hw_account, setze „Status“ = 1, wobei ID = 1;

Die Anzahl der zurückgegebenen betroffenen Zeilen ist 0;

Wenn ein Update ausgeführt wird, die Anzahl der betroffenen Zeilen jedoch 0 ist, wird dann eine Zeilensperre hinzugefügt?

Ja, alle Update-Anweisungen fügen Zeilensperren hinzu (Voraussetzung, innerhalb einer Transaktion)

Verweise

mysql.com

Dies ist das Ende dieses Artikels über die Fallanalyse mehrerer MySQL-Aktualisierungsvorgänge. Weitere relevante Inhalte zu MySQL-Aktualisierungsvorgängen finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • MySQL-Datenbankterminal – allgemeine Befehlscodes für Vorgänge
  • Aggregatabfrage- und Union-Abfragevorgänge für MySQL-Datenbanken
  • Detaillierte grundlegende Operationen an Datentabellen in der MySQL-Datenbank
  • MySQL-Datenbankoperationen und Datentypen
  • Spezifische Verwendung von MySQL-Operatoren (und, oder, in, nicht)
  • MySQL 8.0 kann jetzt JSON verarbeiten
  • Zusammenfassung der erweiterten MySQL-Bedienungsanleitung

<<:  Einführung in häufig verwendete MySQL-Befehle in der Linux-Umgebung

>>:  Detaillierte Erläuterung der Prinzippraxis des Bootstrap-Frameworks für CSS3-Medienabfragen mit responsivem Layout (empfohlen)

Artikel empfehlen

Nginx-Anti-Crawler-Strategie, um UA am Crawlen von Websites zu hindern

Anti-Crawler-Richtliniendatei hinzugefügt: vim /u...

Interner Ereignisrückruf der Webkomponentenkomponente und Problempunktanalyse

Inhaltsverzeichnis Vorne geschrieben Was genau is...

React realisiert den gesamten Prozess des Seitenwasserzeicheneffekts

Inhaltsverzeichnis Vorwort 1. Anwendungsbeispiele...

Einführung und Verwendungszusammenfassung der negativen Margenfunktion

Bereits in den CSS2-Empfehlungen von 1998 verschwa...

So versetzen Sie JavaScript in den Ruhezustand oder in den Wartezustand

Inhaltsverzeichnis Überblick Überprüfen von setTi...

Tiefgreifendes Verständnis von Worker-Threads in Node.js

Inhaltsverzeichnis Überblick Die Geschichte der C...

Grafisches Tutorial zur Installation von JDK1.8 unter CentOS7.4

Schritte zur Linux-Installation von JDK1.8 1. Übe...

Verwenden von js zum Implementieren eines Zahlenratespiels

Letzte Woche gab mir der Lehrer eine kleine Hausa...

Das WeChat-Applet zeichnet die Bewegungsbahn des Benutzers auf

Inhaltsverzeichnis Konfiguration hinzufügen JSON-...

Mehrere Methoden zum Ändern des MySQL-Root-Passworts (empfohlen)

Methode 1: Verwenden Sie den Befehl SET PASSWORD ...

So verwenden Sie den Vue-Filter

Inhaltsverzeichnis Überblick Filter definieren Ve...

So schreiben Sie asynchrone Aufgaben in modernem JavaScript

Vorwort In diesem Artikel untersuchen wir die Ent...

JavaScript-Canvas zum Erstellen eines Rubbellos-Beispiels

In diesem Artikel wird der spezifische Code von J...