Detailliertes Beispiel für Zeilensperren in MySQL

Detailliertes Beispiel für Zeilensperren in MySQL

Vorwort

Sperren sind Synchronisierungsmechanismen, mit denen der Ressourcenzugriff bei der Ausführung mehrerer Threads zwangsweise eingeschränkt wird. Datenbanksperren können je nach Granularität der Sperren in Sperren auf Zeilenebene, Sperren auf Tabellenebene und Sperren auf Seitenebene unterteilt werden.

Sperren auf Zeilenebene

Zeilensperren sind der feinkörnigste Sperrmechanismus in MySQL. Dies bedeutet, dass nur die aktuell bearbeitete Zeile gesperrt wird. Die Wahrscheinlichkeit von Sperrkonflikten auf Zeilenebene ist sehr gering und ihre Granularität ist am geringsten, aber die Kosten für die Sperrung sind am höchsten. Zeilensperren werden in gemeinsam genutzte Sperren und exklusive Sperren unterteilt.

Merkmale:

Der Overhead ist hoch, die Sperren sind langsam und es können Deadlocks auftreten; die Sperrgranularität ist gering, die Wahrscheinlichkeit eines Sperrkonflikts ist am höchsten und die Parallelität ist ebenfalls hoch;

Umsetzungsprinzip:

InnoDB-Zeilensperren werden durch Sperren von Indexelementen implementiert, was sich von MySQL und Oracle unterscheidet. Letzteres wird durch Sperren der entsprechenden Datenzeilen in der Datenbank implementiert. Die Zeilensperren von InnoDB bestimmen, dass Zeilensperren nur zum Abrufen von Daten über Indexbedingungen verwendet werden können. Andernfalls werden Sperren auf Tabellenebene direkt verwendet. Besonderer Hinweis: Wenn Sie Sperren auf Zeilenebene verwenden, müssen Sie Indizes verwenden

Zum Beispiel:

Tabellenstruktur erstellen

CREATE TABLE `developerinfo` (
 `userID` bigint(20) NICHT NULL,
 `name` varchar(255) DEFAULT NULL,
 `passWord` varchar(255) DEFAULT NULL,
 PRIMÄRSCHLÜSSEL (`Benutzer-ID`),
 SCHLÜSSEL `PASSWORD_INDEX` (`passWord`) MIT BTREE
)ENGINE=InnoDB STANDARD-CHARSET=utf8;

Einfügen von Daten

INSERT INTO `developerinfo` VALUES ('1', 'liujie', '123456');
INSERT INTO `developerinfo` VALUES ('2', 'yitong', '123');
INSERT INTO `developerinfo` VALUES ('3', 'tong', '123456');

(1) Abfragen der Datenbank mit dem Primärschlüsselindex und Verwendung von Zeilensperren

Öffnen Sie zum Testen drei Befehlszeilenfenster

Befehlszeilenfenster 1 Befehlszeilenfenster 2 Befehlszeilenfenster 3

mysql> setze Autocommit = 0;
Abfrage OK, 0 Zeilen betroffen
mysql> wähle * aus Entwicklerinfo, wobei Benutzer-ID = „1“ für Update;
+--------+--------+----------+
| Benutzer-ID | Name | Passwort |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
1 Reihe im Set 
|mysql> setze Autocommit = 0;
Abfrage OK, 0 Zeilen betroffen
mysql> wähle * aus Entwicklerinfo, wobei Benutzer-ID = „1“ für Update;
warte|mysql> setze Autocommit = 0;
Abfrage OK, 0 Zeilen betroffen
mysql> wähle * aus Entwicklerinfo, wobei Benutzer-ID = „3“ für Update ist;
+--------+------+----------+
| Benutzer-ID | Name | Passwort |
+--------+------+----------+
| 3 | Zange | 123456 |
+--------+------+----------+
1 Reihe im Set
|mysql> festschreiben;
Abfrage OK, 0 Zeilen betroffen mysql> select * from developerinfo where userid = '1' für Update;
+--------+--------+----------+
| Benutzer-ID | Name | Passwort |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
1 Reihe im Set

(2) Abfragen nicht indizierter Felder zur Abfrage der Datenbank mithilfe von Zeilensperren

Öffnen Sie zum Testen zwei Befehlszeilenfenster

Befehlszeilenfenster 1 Befehlszeilenfenster 2

|mysql> setze autocommit=0;
Abfrage OK, 0 Zeilen betroffen
mysql> select * from developerinfo where name = 'liujie' für Update;
+--------+--------+----------+
Benutzer-ID Name Passwort
+--------+--------+----------+
1. Liujie 123456
+--------+--------+----------+
1 Zeile im Satz |mysql> set autocommit=0;
Abfrage OK, 0 Zeilen betroffen
mysql> select * from developerinfo where name = 'tong' für Update;
Warten|
mysql> festschreiben;
Abfrage OK, 0 Zeilen betroffen mysql> select * from developerinfo where name = 'liujie' für Update;
+--------+--------+----------+
| Benutzer-ID | Name | Passwort |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
1 Reihe im Set

##### (3) Abfrage der Datenbank mit nicht eindeutigen Indexfeldern, um mehrere Zeilen mit Zeilensperren zu sperren

MySQL-Zeilensperren sind vorgetäuschte Sperren für Indizes und nicht für Datensätze. Daher können unterschiedliche Datensätze gesperrt sein.

Öffnen Sie zum Testen drei Befehlszeilenfenster

Kommandozeilenfenster 1 Kommandozeilenfenster 2 Kommandozeilenfenster 3

mysql> setze Autocommit=0;
Abfrage OK, 0 Zeilen betroffen
mysql> select * from developerinfo where password = '123456
' für Update;
+--------+--------+----------+
| Benutzer-ID | Name | Passwort |
+--------+--------+----------+
| 1 | liujie | 123456 |
| 3 | Zange | 123456 |
+--------+--------+----------+
2 Zeilen im Satz MySQL> Set Autocommit =0;
Abfrage OK, 0 Zeilen betroffen
mysql> wähle * aus Entwicklerinfo, wobei Benutzer-ID = „1“ für Update;

Warten

mysql> setze Autocommit = 0;
Abfrage OK, 0 Zeilen betroffen
mysql> select * from developerinfo where userid = '2
' für Update;
+--------+--------+----------+
| Benutzer-ID | Name | Passwort |
+--------+--------+----------+
| 2 | 123 |
+--------+--------+----------+
1 Reihe im Set
Commit; mysql> Auswahl * aus Entwicklerinfo, wobei Benutzer-ID = „1“ für Update;
+--------+--------+----------+
| Benutzer-ID | Name | Passwort |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
1 Reihe im Set

##### (4) Wenn ein Index in einer Bedingung verwendet wird, um eine Datenbanksuche durchzuführen, muss MySQL anhand verschiedener Ausführungspläne bestimmen, ob der Index verwendet werden soll. Wenn Sie bestimmen müssen, wie Explain zur Beurteilung des Index verwendet werden soll, hören Sie sich bitte die nächste Analyse an.

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:
  • Detaillierte Analyse von MySQL-Deadlock-Problemen
  • Zusammenfassung der Wissenspunkte zu MySQL-Index, Sperre und Transaktion
  • Beispielanalyse der Verwendung gemeinsam genutzter und exklusiver Sperren in MySQL
  • Tiefgreifendes Verständnis von globalen Sperren und Tabellensperren in MySQL
  • Zusammenfassung der MySQL-Sperrwissenspunkte

<<:  Best Practices für die Entwicklung von Amap-Anwendungen mit Vue

>>:  Detailliertes Tutorial zur Installation des Tomcat-Servers und zur Konfiguration von Umgebungsvariablen unter Win10 (Bild und Text)

Artikel empfehlen

Vermeiden Sie den Missbrauch zum Lesen von Daten in Vue

Inhaltsverzeichnis Vorwort 1. Der Prozess der Ver...

Vergleich zweier Implementierungsmethoden der Vue-Dropdown-Liste

Zwei Implementierungen der Vue-Dropdown-Liste Die...

Lösung für den Überlauf der HTML-Tabelle

Wenn die Tabelle breit ist, kann es zu einem Über...

Detaillierter Prozessbericht der Vue2-Initiierungsanfragen mit Axios

Inhaltsverzeichnis Vorwort Axios-Installation und...

So aktualisieren Sie MySQL 5.6 auf 5.7 unter Windows

Vorne geschrieben Es gibt zwei Möglichkeiten, MyS...

Spezifische Verwendung von Bootstrap5-Haltepunkten und Containern

Inhaltsverzeichnis 1. Bootstrap5-Haltepunkte 1.1 ...

Gemeinsame MySQL-Sicherungsbefehle und Shell-Sicherungsskripte

Um mehrere Datenbanken zu sichern, können Sie den...

Einrichten von VMware vSphere in VMware Workstation (Grafisches Tutorial)

VMware vSphere ist die branchenführende und zuver...

Lösung für die geringe Schreibeffizienz von unter AIX gemountetem NFS

Von NFS bereitgestellte Dienste Mounten: Aktivier...