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

Freigabe der Schritte zum SVN-Dienstsicherungsvorgang

Schritte zur Sicherung des SVN-Dienstes 1. Quells...

Einige Fallstricke beim JavaScript Deep Copy

Vorwort Als ich zuvor zu einem Vorstellungsgesprä...

So konvertieren Sie MySQL-Bin-Log-Protokolldateien in SQL-Dateien

mysqlbinlog-Version anzeigen mysqlbinlog -V [--ve...

ReactRouter-Implementierung

ReactRouter-Implementierung ReactRouter ist die K...

Tipps zur MySQL-Leistungsoptimierung

MySQL-Leistungsoptimierung MySQL wird in Internet...

Besprechen Sie den Entwicklungstrend der Baidu Encyclopedia UI

<br />Die offizielle Version der Baidu-Enzyk...

Vue ruft die Computerkamera auf, um die Fotofunktion zu realisieren

In diesem Artikelbeispiel wird der spezifische Co...

CentOS8-Installationstutorial für JDK8/Java8 (empfohlen)

Vorwort Zuerst wollte ich es mit wget auf CentOS8...

Detaillierte Erklärung des Overflow-Scrollens zur Lösung des Scroll-Lag-Problems

Vorwort Wenn Sie das Attribut „overflow: scroll“ ...

Vue 2.0 Grundlagen im Detail

Inhaltsverzeichnis 1. Funktionen 2. Beispiele 3. ...

Detaillierte Erklärung zur Verwendung der Vue-Nummernschild-Eingabekomponente

Eine einfache Nummernschild-Eingabekomponente (vu...

Detaillierte Erklärung des Vue-Lebenszyklus

Inhaltsverzeichnis Warum den Lebenszyklus versteh...