Lösung für das Problem der MySQL-Transaktionsparallelität

Lösung für das Problem der MySQL-Transaktionsparallelität

Ich bin während der Entwicklung auf ein solches Problem gestoßen

Ein auf 100 aktualisierter Video-Wiedergabedatensatz bedeutet, dass das Video angesehen wurde, und wird bei nachfolgenden Anfragen nicht aktualisiert.

sich herausstellen:

Daher sind viele der darin enthaltenen Daten problematisch.

Es wird spekuliert, dass die folgenden Umstände dazu führen werden,

Die erste Anforderungstransaktion wird ausgeführt und wurde noch nicht festgeschrieben (da die lokale Reproduktion manchmal schwierig ist, schlafe ich das Programm bei der Verarbeitung des ersten Datensatzes manuell einige Sekunden lang, um diesen Effekt zu erzielen).

Die Ausführung der zweiten Anforderungstransaktion wurde begonnen. Zu diesem Zeitpunkt beträgt der gefundene historische Maximalwert nicht 100 und wird daher aktualisiert.

Ich habe im Internet nach der Lösung gesucht:

Pessimistische Sperre

Direktes Sperren von Zeilendatensätzen

Ich habe das lokal getestet und es funktioniert wirklich. Eine Transaktion wird gestartet, aber nicht beendet, und die zweite Transaktion wartet. Aufgrund der Systemparallelität wird es jedoch zu einem Blockierungszustand kommen. Ich wage es nicht, darüber nachzudenken, also zeichne ich diese Methode einfach auf.

Manuelle Simulation:

Führen Sie die erste Transaktion aus:

-- Video 100 BEGINNT;

Wählen Sie * aus `biz_coursestudyhistory`, wobei sid = 5777166;

UPDATE biz_coursestudyhistory setze studyStatus = 100,versionNO=versionNO+1, wobei sid = 1 UND versionNO = 0;

- commit; Nicht zuerst ausführen, zuerst kommentieren und nur das oben genannte ausführen 

Führen Sie dann die zweite Transaktion aus:

BEGINNEN;
 
UPDATE biz_coursestudyhistory setze studyStatus = 90,versionNO=versionNO+1, wobei sid = 1 UND versionNO = 0;
 
Wählen Sie * aus `biz_coursestudyhistory`, wobei sid = 1 für Update ist;
 
BEGEHEN;

Sie werden feststellen, dass Ihnen kein Erfolg gelingt und Sie sich immer in einem Wartezustand befinden.

Schlösser ansehen

Es ist tatsächlich gesperrt. Hier wird die zweite Transaktion ausgeführt, solange das Commit der ersten Transaktion ausgeführt wird.

Daraus können wir ersehen, dass Zeilensperren direkt den idealen Zustand der Datenvereinigung erreichen können. Wenn eine Transaktion geändert wird, können andere Vorgänge nicht ausgeführt werden. Ich denke, dass dies für Sicherheitsprojekte wie Banken besser geeignet ist.

Optimistisches Sperren:

Das ist einfacher und verursacht keine Blockierung

Der Weg besteht darin, die Versionsnummer hinzuzufügen

var maxver = select max(version) from table

Zum Aktualisieren verwenden Sie

update table set studystatus = xxx,version = version +1 where id =1 and version = maxver

Geschriebene Wörter

INSERT in Tabelle (contentStudyID,courseWareID,studyStatus,studyTime,endTime)
Wählen Sie 27047358,3163,100,333,NOW() aus dual, wo nicht vorhanden (wählen Sie 1 aus Tabelle, wo contentStudyID =27047358 und
Kursware-ID = 3163
 )

Auf diese Weise können Sie beim Aktualisieren oder Schreiben direkt feststellen, ob die Daten in der Bibliothek vorhanden sind. Wenn sie nicht vorhanden sind, werden sie von anderen Threads verwendet.

Nach der Umstellung auf diesen Schreibstil und der Verwendung von JMeter für Multithread-Tests waren die anfänglichen Aktualisierungen mehrerer Datensätze erfolgreich, jetzt ist jedoch nur noch ein Datensatz erfolgreich und der Rest schlägt fehl.

Vom Einfügen mehrerer Datensätze am Anfang bis zum Einfügen nur eines Datensatzes später

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:
  • Beispiel für die Verwendung von MySQL-Transaktionsfunktionen zur Implementierung einer gleichzeitigen und sicheren Auto-Increment-ID
  • Lösung für das Problem der gesperrten Transaktionsverarbeitung mit hoher Parallelität in PHP+MySQL
  • Kann die wiederholbare Leseebene von MySQL Phantomlesevorgänge lösen?
  • Detaillierte Erklärung, wie MySQL Phantom-Lesevorgänge löst
  • Detaillierte Erklärung zu MySQL-Phantomlesevorgängen und wie man sie eliminiert
  • MySQL Series 10 MySQL-Transaktionsisolierung zur Implementierung der Parallelitätskontrolle
  • So lösen Sie das Phantomleseproblem in MySQL
  • mysql + mybatis implementiert gespeicherte Prozedur + Transaktion + gleichzeitigen Mehrfachabruf von Seriennummern
  • Detaillierte Erläuterung des gleichzeitigen Dirty Read + nicht wiederholbaren Read + Phantom Read in MySQL-Transaktionen

<<:  Beispielcode zur Konvertierung von http in https mit nginx

>>:  Verwenden von vue3 zum Implementieren eines Beispiels für die Kapselung von Zählfunktionskomponenten

Artikel empfehlen

Modularität in Node.js, npm-Paketmanager erklärt

Inhaltsverzeichnis Das Grundkonzept der Modularit...

Detaillierte Erläuterung der Vue-Projektverpackung

Inhaltsverzeichnis 1. Zugehörige Konfiguration Fa...

Lösen Sie das domänenübergreifende Problem von Vue + SpringBoot + Shiro

Inhaltsverzeichnis 1. Konfigurieren Sie das Vue-F...

Lösungen für Probleme bei der Verwendung von addRoutes in Vue-Projekten

Inhaltsverzeichnis Vorwort 1. 404 Seite 1. Ursach...

Detaillierte Erklärung der JSONObject-Verwendung

JSONObject ist lediglich eine Datenstruktur, die ...

So verwenden Sie IDEA zum Konfigurieren von Tomcat und Erstellen von JSP-Dateien

Bevor Sie idea zum Schreiben von JSP-Dateien verw...

LINUX Prüft, ob der Port belegt ist

Ich konnte nie herausfinden, ob der Port belegt i...

Implementierung des Docker View Container Log-Befehls

Warum sollten wir das Protokoll lesen? Wenn beisp...

Eine Frage zum Verständnis mehrerer Parameter des Sortierbefehls in Linux

Der Sortierbefehl wird sehr häufig verwendet, ver...