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

Die Vue-Konfigurationsdatei generiert automatisch Routing- und Menüinstanzcode

Inhaltsverzeichnis Vorne geschrieben router.json ...

Detaillierte Erläuterung des Vue-Routing-Routers

Inhaltsverzeichnis Routing-Plugins modular nutzen...

Schritte zum Aktivieren von TLS in Docker für eine sichere Konfiguration

Vorwort Ich hatte zuvor die 2375 Remote API von D...

Details zur MySQL-Sicherheitsverwaltung

Inhaltsverzeichnis 1. Vorstellen gemäß der Bestel...

Detaillierte Schritte zur Installation von MySQL 8.0.18-winx64 unter Win10

1. Gehen Sie zunächst auf die offizielle Website,...

So fügen Sie ein Lua-Modul zu Nginx hinzu

Lua installieren wget http://luajit.org/download/...

Installationshandbuch für VMware Workstation 15 Pro (für Anfänger)

01. VMware Workstation Pro 15 herunterladen Herun...

ReactJs-Grundlagen-Tutorial - Essential Edition

Inhaltsverzeichnis 1. Einführung in ReactJS 2. Ve...

MySQL-Optimierung: So schreiben Sie hochwertige SQL-Anweisungen

Vorwort Im Internet gibt es zahlreiche Informatio...