Beispiele für die Verwendung von pessimistischem und optimistischem Sperren in MySQL

Beispiele für die Verwendung von pessimistischem und optimistischem Sperren in MySQL

Pessimistische Sperre

Pessimistische Sperre, betrachtet die Daten als pessimistisch. Wenn wir die Daten abfragen, fügen wir eine Sperre hinzu. Verhindern Sie, dass andere Threads Manipulationen vornehmen, bis sie die Sperre erhalten.

Als Beispiel sei die folgende Tabelle genannt. Status=1 bedeutet, dass die Bestellung aufgegeben werden kann, und Status=2 bedeutet, dass die Bestellung nicht aufgegeben werden kann. Wenn während des parallelen Prozesses zwei Benutzer gleichzeitig den Status = 1 prüfen, können zwar beide Benutzer logischerweise neue Bestellungen hinzufügen, dies führt jedoch zu einem Überverkauf des Produkts.

Das folgende Beispiel

CREATE TABLE `Waren` (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `name` varchar(255) DEFAULT NULL,
 `status` tinyint(4) DEFAULT NULL,
 `version` int(11) DEFAULT NULL,
 PRIMÄRSCHLÜSSEL (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4
INSERT INTO demo.goods (ID, Name, Status, Version) VALUES (1, „Test“, 1, 1);

Ausführung von session1

setze Autocommit=0;
beginnen;
wählen *
von Waren, wobei ID=1 und Warenstatus=1 für Aktualisierung;
Warensatzstatus aktualisieren=2, wobei ID=1;

session2 Ausführung

beginnen;
Wählen Sie * aus Waren mit ID=1 für Aktualisierung;

Zu diesem Zeitpunkt ist Sitzung 2 blockiert, da sich die Sperre noch in Sitzung 1 befindet und die Sperre daher immer wartet. Wenn session1 nicht übermittelt wird, wird session2 nach einer bestimmten Zeit unterbrochen und die Verbindung getrennt und meldet

(1205, 'Wartezeit für Sperre überschritten; versuchen Sie, die Transaktion neu zu starten') Fehler,

Die spezifische Wartezeit für die Sperre kann durch Festlegen des Parameters innodb_lock_wait_timeout gesteuert werden.

Wenn der Commit-Vorgang zu diesem Zeitpunkt in Sitzung1 ausgeführt wird, erhält Sitzung2 die Abfrageergebnisse und die Sperre wird an Sitzung2 vergeben.

Wir können auch

Status wie „innodb_row_lock_%“ anzeigen;

Um weitere Informationen zur Sperre anzuzeigen.

Optimistisches Sperren

Optimistisches Sperren unterscheidet sich vom pessimistischen Sperren. Optimistisches Sperren wird durch ein eigenes Programm und nicht durch mySql selbst implementiert.

Optimistisches Sperren sperrt die Abfrage nicht und überprüft beim Aktualisieren nur die Versionsnummer.

Wenn wir beispielsweise die Tabelle „goods“ abfragen und feststellen, dass die Version 1 ist, dann wird SQL beim Aktualisieren dieser Tabelle

Wählen Sie * aus Waren mit ID=1;
Warensatzstatus aktualisieren=2, Version=Version+1 wobei ID=1 und Version=1;

Die Version ist hier die Versionsnummer zum Zeitpunkt der Abfrage und jede Änderung führt zu Version+1. Wenn die Versionsnummern nicht übereinstimmen, ist das Update nicht erfolgreich.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Beispiele für optimistisches und pessimistisches Sperren in MySQL
  • Verständnis und Anwendungsanalyse der pessimistischen und optimistischen Sperre von MySQL
  • Umfassende Analyse von optimistischer Sperre, pessimistischer Sperre und MVCC in MySQL
  • Pessimistisches Sperren und optimistisches Sperren in MySQL
  • MySQL-Implementierung für pessimistisches und optimistisches Sperren

<<:  Detaillierte Erklärung zur Ausführung von Skripten oder Anweisungen durch Zabbix auf Remote-Hosts

>>:  Detaillierte Beispiele für die Ausführung von Zabbix-Remotebefehlen

Artikel empfehlen

Detaillierte Erläuterung des MySQL-Isolationsebenen-Operationsprozesses (cmd)

Beispielvorgang für nicht festgeschriebenes Lesen...

Win2008 R2 MySQL 5.5 ZIP-Format MySQL-Installation und -Konfiguration

Installation und Konfiguration von MySQL im ZIP-F...

Einfache Methode zur Installation von MySQL unter Linux

Bei der Onlinesuche nach Methoden zur Installatio...

Ausführliche Erläuterung versteckter Felder, einer neuen Funktion von MySQL 8.0

Vorwort MySQL Version 8.0.23 fügt eine neue Funkt...

MySQL verwendet Ereignisse, um geplante Aufgaben abzuschließen

Ereignisse können die Ausführung von SQL-Code ein...

Warum Google und Facebook Docker nicht verwenden

Der Grund für das Schreiben dieses Artikels beste...

svg+css oder js zum Erstellen eines Tick-Animationseffekts

Mein Chef hatte mich gebeten, ein Programm zu ers...

Vue nutzt Amap zur Realisierung der Stadtpositionierung

In diesem Artikel wird der spezifische Code von V...

So stellen Sie Node.js mit Docker bereit

Vorwort Node wird als mittlere Schicht im Projekt...

JavaScript verwendet setTimeout, um einen Countdown-Effekt zu erzielen

Um die Fähigkeit zum Schreiben von nativem JavaSc...

Detaillierte Analyse der MySQL-Abfrageabfangung

Inhaltsverzeichnis 1. Abfrageoptimierung 1. MySQL...

Beispielcode zur Implementierung des Verlaufs in Vuex

Ich habe vor Kurzem eine visuelle Operationsplatt...