Heim  >  Artikel  >  Datenbank  >  Was ist das Implementierungsprinzip der MySQL-Sperre auf Zeilenebene?

Was ist das Implementierungsprinzip der MySQL-Sperre auf Zeilenebene?

coldplay.xixi
coldplay.xixiOriginal
2020-10-26 15:47:236013Durchsuche

MySQL-Prinzip der Zeilensperrenimplementierung: 1. Die Zeilensperre von InnoDB wird durch Sperren von Indexelementen implementiert. Dies ist der Unterschied zwischen MySQL und Oracle ist anders; 2. InnoDB bestimmt, dass Sperren auf Zeilenebene nur zum Abrufen von Daten über Indexbedingungen verwendet werden können. Verwenden Sie Sperren auf Tabellenebene direkt.

Was ist das Implementierungsprinzip der MySQL-Sperre auf Zeilenebene?

MySQL-Sperren auf Zeilenebene:

Sperre ist ein Synchronisationsmechanismus, der verwendet wird, um den Ressourcenzugriff beim Ausführen von Multithreads zwangsweise einzuschränken. Datenbanksperren können je nach Granularität in Sperren auf Zeilenebene unterteilt werden das Schloss. Sperren auf Tabellenebene und Sperren auf Seitenebene

Sperren auf Zeilenebene

Sperren auf Zeilenebene sind der detaillierteste Sperrmechanismus in MySQL. Dies bedeutet, dass nur die aktuell bearbeitete Zeile gesperrt ist und es zu Sperrkonflikten auf Zeilenebene kommt Die Wahrscheinlichkeit ist sehr gering, die Granularität ist am geringsten, aber die Sperrkosten sind am höchsten. Sperren auf Zeilenebene werden in gemeinsame Sperren und exklusive Sperren unterteilt.

Eigenschaften:

Hoher Overhead, langsame Sperren und Deadlocks können auftreten; die Sperrgranularität ist minimal, Sperrkonflikte treten am wahrscheinlichsten auf und die Parallelität ist hoch;

InnoDB-Zeilensperre ist Dies wird durch das Sperren der Indexelemente erreicht. Dies unterscheidet sich von MySQL und Oracle. Letzteres erfolgt durch das Sperren der Indexelemente in der Datenbank. Dies wird durch das Sperren der entsprechenden Datenzeilen erreicht. Die Sperre auf Zeilenebene von InnoDB bestimmt, dass Zeilen nur zum Abrufen von Daten über Indexbedingungen verwendet werden können. Ebenensperre, andernfalls verwenden Sie die Sperre auf Tabellenebene direkt.

Besondere Aufmerksamkeit: Wenn Sie Sperren auf Zeilenebene verwenden, müssen Sie einen Index verwenden. Zum Beispiel:

Erstellen Sie eine Tabellenstruktur Öffnen Sie drei Befehlszeilenfenster. Testen Sie es

mysql> commit;mysql> Developerinfo, wobei Benutzer-ID = '1' für Update;
Befehlszeilenfenster 1 Befehlszeilenfenster 2 Befehlszeilenfenster 3
mysql> set autocommit = 0;
Abfrage OK, 0 Zeilen betroffen
mysql> select * from Developerinfo where userid = '1' for aktualisieren;
+-------- +--------+----------+
|name |
+--------+------ -- +---------+
| 123456 |
+-------- +--------+----------+
1 Zeile im Satz
mysql> set autocommit = 0;
Abfrage OK, 0 Zeilen betroffen

mysql> select * from Developerinfo where userid = '1' for Update;

Warten

mysql> set autocommit = 0;
Abfrage OK, 0 Zeilen Betroffen
mysql> wählen Sie * aus der Entwicklerinfo aus, wobei die Benutzer-ID = '3' ist update;
+--------+---------+
| passWort |. +------+---------+
| 3 |. +------+----------+
1 Zeile im Satz

Abfrage OK, 0 Zeilen betroffen
+--------+-------- +---------+
|. Benutzername |
+-------- +---------+
| 123456 |
+-------- +--------+----------+
1 Zeile im Satz
(2) Fragen Sie nicht indizierte Felder ab, um die Datenbank abzufragen Zeilen sperren


Öffnen Sie zwei Befehlszeilenfenster zum Testen

Befehlszeilenfenster 1mysql> set autocommit=0;Abfrage OK, 0 Zeilen betroffenmysql> update;+--------+---------+| passWort |. -+--------+---------+1 Reihe im Satz
Befehlszeilenfenster 2
mysql> Wählen Sie * aus der Entwicklerinfo aus, wobei Name = 'liujie' für die Aktualisierung ist;
+-------- +--------+---------+
|. passwort |. +---------+
|. 123456 |
+-------- +--------+----------+
1 Zeile im Satz


MySQL> autocommit=0;
Abfrage OK, 0 Zeilen betroffen
mysql> where name = 'tong' for update;
Wait

| 123456 |
+--------+ ----------+



(3) Fragen Sie nicht eindeutige Indexfelder ab, um die Datenbank abzufragen.

Die Zeilensperren von MySQL sind falsche Sperren für Indizes, nicht für Datensätze. Daher kann es vorkommen, dass unterschiedliche Datensätze gesperrt werden

Öffnen Sie drei. Verwenden Sie zwei Befehlszeilenfenster zum Testen.

Befehlszeilenfenster 1.Befehlszeilenfenster 2.Befehlszeilenfenster 3 mysql> Wählen Sie * aus der Entwicklerinfo aus, wobei das Passwort = '123456+--------+----------+| |. passWort |+-------- +--------+---------+| || 123456 |+--------+ ----------+1 Zeile im Satz(Video )
' für die Aktualisierung ist;
| 123456 |
| 3 |. 123456 |
+--------+-------- +
2 Zeilen im Satz

mysql> set autocommit =0 ;
Abfrage OK, 0 Zeilen betroffen

mysql> select * from Developerinfo where userid = '1' für Update;

wait

mysql> set autocommit = 0;
Query OK, 0 Zeilen Betroffen

MySQL> wählen Sie * aus Entwicklerinfo aus, wobei Benutzer-ID = '2

' ist update;

+--------+---------+

| passWort |. -+--------+---------+
+--------+--------+----------+
1 Zeile im Satz



commit;

mysql> Developerinfo, wobei Benutzer-ID = '1' für update;
+--------+---------+
| passWort |. -+--------+---------+





(4) Bei Verwendung eines Index zum Betreiben und Abrufen der Datenbank in der Bedingung, ob der Index verwendet werden soll, ist auch MySQL erforderlich Beurteilen Sie verschiedene Ausführungspläne Entscheiden Sie, ob Sie den Index verwenden möchten. Wenn Sie entscheiden müssen, wie Sie EXPLAIN zur Beurteilung des Index verwenden möchten, hören Sie sich bitte das nächste Kapitel zur Zerlegung an. Weitere verwandte kostenlose Lernempfehlungen:
MySQL-Tutorial


Das obige ist der detaillierte Inhalt vonWas ist das Implementierungsprinzip der MySQL-Sperre auf Zeilenebene?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn