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

Tutorial zur Verarbeitung statischer Ressourcen in Tomcat

Vorwort Alle Anfragen in Tomcat werden von Servle...

Vues Leitfaden zu Fallstricken bei der Verwendung von Drosselungsfunktionen

Vorwort In einem üblichen Geschäftsszenario müsse...

Detaillierte Erklärung zur Installation der PHP-Curl-Erweiterung unter Linux

Dieser Artikel beschreibt, wie man die PHP-Curl-E...

Linux-Tutorial zum Ersetzen von Zeichenfolgen mit dem Befehl sed

Um eine Zeichenfolge zu ersetzen, müssen wir das ...

Vertieftes Verständnis des Implementierungsprinzips des Require Loader

Vorwort Wir sagen oft, dass Node keine neue Progr...

Detaillierte Schritte zum Bereitstellen von lnmp unter Docker

Inhaltsverzeichnis Ziehen Sie ein CentOS-Image Ge...

Nginx verwendet den Gzip-Algorithmus zum Komprimieren von Nachrichten

Was ist HTTP-Komprimierung Manchmal werden relati...

HTML-Elemente durch Anzeige oder Sichtbarkeit verbergen

Manchmal müssen wir steuern, ob HTML-Elemente auf ...

Lernen wir JavaScript objektorientiert kennen

Inhaltsverzeichnis JavaScript-Prototypenkette Obj...

So erreichen Sie eine nahtlose Token-Aktualisierung

Inhaltsverzeichnis 1. Nachfrage Methode 1 Methode...