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

Spezifische Verwendung von Linux which Befehl

Oft möchten wir in Linux eine Datei finden, wisse...

MySQL-Startfehlerproblem und Szenarioanalyse

1. Komplettlösung 1. Problemanalyse und -lokalisi...

Aktivieren Sie den SSHD-Vorgang im Docker

Installieren Sie zunächst den OpenSSH-Server im D...

So führen Sie das Springboot-Projekt im Docker aus

1. Klicken Sie unten in IDEA auf Terminal und geb...

Grundlegende MySQL-Tabellenabfragen – häufige Fehler beim Left-Join

Überblick Bei kleinen und mittelgroßen Projekten ...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.23

Dieser Artikel zeichnet das Installationstutorial...

Zwei einfache Beispiele für Menünavigationsleisten

Menüleiste Beispiel 1: Code kopieren Der Code lau...

Stellen Sie die Grafana+Prometheus-Konfiguration mit Docker bereit

docker-compose-monitor.yml Version: '2' N...

HTML ist die zentrale Grundlage für die Entwicklung von WEB-Standards

HTML-zentrierte Front-End-Entwicklung entspricht p...

Erläuterung der MySQL-Indexoptimierung

Bei unserer täglichen Arbeit führen wir manchmal ...

Verwendung des Linux-Befehls passwd

1. Befehlseinführung Mit dem Befehl passwd werden...