Heim >Datenbank >MySQL-Tutorial >MySQL lernt, über Sperren und Klassifizierung zu sprechen
Dieser Artikel hilft Ihnen, die Sperren in MySQL zu verstehen und stellt die Granularitätsklassifizierung von Sperren und die Kompatibilitätsklassifizierung von Sperren vor.
In einem Szenario mit hoher Parallelität weist die Datenbank die folgenden Szenarien auf:
Als Reaktion auf die oben genannten Probleme legt der SQL-Standard fest, dass die Probleme, die unter verschiedenen Isolationsstufen auftreten können, unterschiedlich sind:
MySQL vier Hauptisolationsstufen:
Isolationsstufe | Dirty Read | Non- wiederholbare Lektüre | Phantomlesung |
---|---|---|---|
READ UNCOMMITTED: Uncommitted read | kann passieren | kann passieren | kann passieren |
READ COMMITTED: readcommitted | aufgelöst | kann passieren | kann passieren |
REPEATABLE READ: Wiederholbares Lesen | Gelöst | Gelöst | Kann passieren |
SERIALIZABLE: Serialisierbar | Gelöst | Gelöst | Gelöst |
Es ist ersichtlich, dass MySQL tatsächlich das Problem der Nichtwiederholbarkeit auf der Isolationsebene REPEATABLE READ löst, im Grundedas Phantom-Lese-Problem löst, aber in extremen Fällen gibt es immer noch Phantom-Lesevorgänge.
Was ist also die Lösung? Im Allgemeinen gibt es zwei Lösungen:
1️⃣ MVCC für Lesevorgänge, Sperren für Schreibvorgänge
Bei Lesevorgängen wird unter MVCC auf RR-Ebene beim Starten einer Transaktion eine ReadView generiert und dann über ReadView gefunden Eine historische Version, die die Bedingungen erfüllt, und diese Version wird aus Rückgängig-Protokollen erstellt. Beim Generieren von ReadView wird tatsächlich ein Snapshot generiert, sodass die SELECT-Abfrage zu diesem Zeitpunkt „Snapshot Read“ (oder konsistentes Lesen) lautet. Das wissen wir unter RR , wird eine ReadView nur generiert, wenn eine SELECT-Operation zum ersten Mal während der Ausführung einer Transaktion ausgeführt wird. Nachfolgende SELECT-Operationen verwenden diese ReadView wieder, wodurch nicht wiederholbare Lesevorgänge vermieden werden und das Problem des Phantomlesens weitgehend vermieden wird . Zum Schreiben, da beim Snapshot-Lesen oder konsistenten Lesen kein Sperrvorgang für einen Datensatz in der Tabelle ausgeführt wird und die Transaktion von ReadView eine historische Version ist, die neueste Version des Schreibvorgangs jedoch nicht dieselbe ist Es kann zu Konflikten kommen, sodass andere Transaktionen frei Änderungen an den Datensätzen in der Tabelle vornehmen können. 2️⃣ Lese- und Schreibvorgänge sind gesperrt
Wenn einige unserer Geschäftsszenarien das Lesen der alten Version des Datensatzes nicht zulassen, aber jedes Mal die neueste Version des Datensatzes lesen müssen, z. B. bei einer Bankeinzahlungstransaktion, Sie müssen zuerst den Kontostand auslesen
, ihn dannzum Betrag dieser Einzahlung addieren und schließlich in die Datenbank schreiben
. Nachdem Sie den Kontostand gelesen haben, möchten Sie nicht, dass andere Transaktionen auf den Kontostand zugreifen. Nur bis die aktuelle Einzahlungstransaktion abgeschlossen ist, können andere Transaktionen auf den Kontostand zugreifen. Auf diese Weise muss der Datensatz beim Lesen gesperrt werden, was bedeutet, dass Lesevorgänge und Schreibvorgänge ebenfalls in die Warteschlange gestellt und wie Schreib-/Schreibvorgänge ausgeführt werden.Dirty Reading liegt daran, dass die aktuelle Transaktion einen Datensatz liest, der von einer anderen nicht festgeschriebenen Transaktion geschrieben wurde. Wenn jedoch eine andere Transaktion diesen Datensatz sperrt
, während der Datensatz geschrieben wird, kann die aktuelle Transaktion nicht mehr gelesen werden den Datensatz, so dass es kein Dirty-Read-Problem gibt.Bei nicht wiederholbaren Lesevorgängen liegt dies daran, dass die aktuelle Transaktion zuerst einen Datensatz liest und nachdem eine andere Transaktion Änderungen am Datensatz vornimmt und ihn festschreibt, erhält die aktuelle Transaktion beim erneuten Lesen andere Werte Wenn der Datensatz in der aktuellen Transaktion gelesen wird, wird er gesperrt. Dann kann der Datensatz nicht durch eine andere Transaktion geändert werden, und es erfolgt natürlich kein nicht wiederholbares Lesen. Beim Phantomlesen
liegt das daran, dass die aktuelle Transaktion einen Datensatz in einemBereich liest und dann eine andere Transaktion einen neuen Datensatz in den Bereich einfügt. Wenn die aktuelle Transaktion den Datensatz im Bereich erneut liest, a Wenn ein neuer Datensatz gefunden wird, nennen wir die neu eingefügten Datensätze Phantomdatensätze.
Wie ist dieser Bereich zu verstehen? Wie folgt:Angenommen, es gibt nur ein Datenelement mit id=1
in der Tabelle user. Wenn Transaktion A eine Abfrageoperation von id = 1
ausführt, können die Daten abgefragt werden, wenn es sich um eine Bereichsabfrage handelt, z. B. id in (1,2 ) code> wird nur ein Datenelement abgefragt.
id = 2
aus und übermittelt ihn. Zu diesem Zeitpunkt führt Transaktion A die Abfrage von id in(1,2)
erneut aus und es werden 2 Datensätze gelesen, sodass ein Phantomlesen erfolgt. id=1
的数据。
当事务 A 执行一个id = 1
的查询操作,能查询出来数据,如果是一个范围查询,如 id in(1,2)
,必然只会查询出来一条数据。
此时事务 B 执行一个id = 2
的新增操作,并且提交。
此时事务 A 再次执行id in(1,2)
的查询,就会读取出 2 条记录,因此产生了幻读。
注:由于 RR 可重复读的原因,其实是查不出 id = 2
的记录的,所以如果执行一次 update ... where id = 2
Hinweis
: Aufgrund des wiederholbaren Lesens von RR kann der Datensatz mitid=2
tatsächlich nicht gefunden werden, wenn Sie also ein Update durchführen. .. wo id = 2
, Sie können es herausfinden, indem Sie den Bereich durchsuchen. Es ist nicht einfach, das Problem des Phantomlesens durch Sperren zu lösen, da die Phantomdatensätze nicht vorhanden sind, wenn die aktuelle Transaktion die Datensätze zum ersten Mal liest. Daher ist das Sperren beim Lesen etwas mühsam, da dies nicht der Fall ist Wissen wen man sperrt. Wie löst InnoDB das Problem? Schauen wir uns zunächst an, welche Sperren die InnoDB-Speicher-Engine hat. 2. Schlösser und Klassifizierungen in MySQL JDK-Klassifizierung durch Sperrung:
Was ist die Sperrgranularität? Die sogenannte Sperrgranularität bezieht sich auf den Umfang dessen, was Sie sperren möchten.
Wenn Sie beispielsweise zu Hause auf die Toilette gehen, müssen Sie nur das Badezimmer abschließen. Sie müssen nicht das gesamte Haus abschließen, um zu verhindern, dass Familienmitglieder das Badezimmer betreten.
Was ist eine sinnvolle Sperrgranularität?
Tatsächlich wird das Badezimmer nicht nur zum Toilettengang genutzt, sondern auch zum Duschen und Händewaschen. Dabei geht es um die Optimierung der Sperrgranularität.
Wenn Sie im Badezimmer duschen, können andere tatsächlich gleichzeitig hineingehen und sich die Hände waschen, solange sie isoliert sind, wenn Toilette, Badewanne und Waschbecken alle getrennt und relativ unabhängig (nass und trocken) sind sind getrennt), tatsächlich kann das Badezimmer von drei Personen gleichzeitig genutzt werden, aber natürlich können die drei Personen nicht dasselbe tun. Dadurch wird die Granularität der Verriegelung verfeinert. Solange Sie beim Duschen die Badezimmertür schließen, können andere trotzdem hineingehen und sich die Hände waschen. Wenn die verschiedenen Funktionsbereiche bei der ursprünglichen Gestaltung des Badezimmers nicht unterteilt und isoliert werden, kann die maximale Nutzung der Badezimmerressourcen nicht erreicht werden.
In ähnlicher Weise gibt es auch in MySQL eine Sperrgranularität. Normalerweise in drei Typen unterteilt: Zeilensperren, Tabellensperren und Seitensperren.
Bei der Einführung gemeinsamer Sperren und exklusiver Sperren werden diese tatsächlich für eine bestimmte Zeile aufgezeichnet, sodass sie auch als Zeilensperren bezeichnet werden können.
Das Sperren eines Datensatzes betrifft nur diesen Datensatz, daher ist die Sperrgranularität von Zeilensperren die feinste in MySQL. Die Standardsperre der InnoDB-Speicher-Engine ist die Zeilensperre.
Es weist die folgenden Merkmale auf:
Die geringste Wahrscheinlichkeit eines Sperrenkonflikts und eine hohe Parallelität
Da die Granularität von Zeilensperren gering ist, ist auch die Wahrscheinlichkeit eines Sperrressourcenkonflikts am geringsten, also die Wahrscheinlichkeit einer Sperre Der Konflikt ist gering und die Parallelität ist umso höher, je höher das Geschlecht.
Hoher Overhead und langsames Sperren
Sperren sind sehr leistungsintensiv. Wenn Sie mehrere Daten in der Datenbank sperren, werden zwangsläufig viele Ressourcen beansprucht, und Sie müssen auf die vorherige Sperre warten Sperre aufgehoben werden.
Wird einen Deadlock erzeugen
Was ein Deadlock ist, können Sie unten lesen.
Die Sperre auf Tabellenebene ist eine Sperre auf Tabellenebene, die die gesamte Tabelle sperrt. Sie kann Deadlocks sehr gut vermeiden und ist außerdem der größte granulare Sperrmechanismus in MySQL.
Die Standardsperre der MyISAM-Speicher-Engine ist die Tabellensperre.
Es hat die folgenden Eigenschaften:
Geringer Overhead und schnelles Sperren
Da es die gesamte Tabelle sperrt, muss es schneller sein als das Sperren einzelner Daten.
Es tritt kein Deadlock auf.
Die gesamte Tabelle ist gesperrt. Andere Transaktionen können die Sperre überhaupt nicht erhalten, und natürlich tritt kein Deadlock auf.
Die Sperrgranularität ist groß, die Wahrscheinlichkeit eines Sperrkonflikts ist hoch und die Parallelität ist gering
Die Sperre auf Seitenebene ist eine einzigartige Sperrstufe in MySQL, die nicht gefunden wird in anderer Datenbankverwaltungssoftware üblich.
Die Granularität von Sperren auf Seitenebene liegt zwischen Sperren auf Zeilenebene und Sperren auf Tabellenebene, sodass der zum Erhalten von Sperren erforderliche Ressourcenaufwand und die gleichzeitigen Verarbeitungsfunktionen, die sie bereitstellen können, ebenfalls zwischen den beiden oben genannten liegen. Darüber hinaus können Sperren auf Seitenebene ebenso wie Sperren auf Zeilenebene Deadlocks verursachen.
Zeilensperre | Tabellensperre | Seitensperre | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Granularität sperren | Klein | Groß | Zwischen den beiden | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Verriegelungseffizienz | Langsam | Schnell | Konfliktwahrscheinlichkeit zwischen den beiden Leistungsaufwand | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Klein | Zwischen den zwei | Ist es ein Stillstand | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Nein | Ja |
4. Klassifizierung der SperrkompatibilitätIn MySQL wird das Lesen von Daten hauptsächlich in aktuelles Lesen und Snapshot-Lesen unterteilt:
In den meisten Fällen betreiben wir die Datenbank basierend auf aktuellen Lesevorgängen, und in gleichzeitigen Szenarien müssen wir nicht nur zulassen, dass Lesen-Lesen-Situationen nicht beeinträchtigt werden, sondern auch Schreiben-Schreiben und Lesen ermöglichen Da sich Schreib- oder Schreib-Lese-Vorgänge gegenseitig blockieren, müssen Sie in MySQL „gemeinsame Sperren“ und „exklusive Sperren“ verwenden. 4.1 Gemeinsame Sperren und exklusive Sperren Geteilte Sperren(Shared Locks) können auch als Lesesperren bezeichnet werden, abgekürzt alsS-Sperren. Daten können gleichzeitig gelesen werden, aber keine Transaktion kann die Daten ändern. Exklusive Sperren (Exklusive Sperren), können auch als exklusive Sperren oder Schreibsperren bezeichnet werden, die alsX-Sperren bezeichnet werden. Wenn etwas eine exklusive Sperre zu einer Zeile hinzufügt, kann nur diese Transaktion sie lesen und schreiben. Andere Transaktionen können keine Sperren hinzufügen, aber sie müssen darauf warten freigeben. Lassen Sie uns die Situation beim Erwerb der Sperre analysieren: Wenn es Transaktion A und Transaktion B gibt Transaktion A erwirbt die S-Sperre eines Datensatzes und zu diesem Zeitpunkt möchte Transaktion B auch die S-Sperre des Datensatzes erwerben, Dann kann auch Transaktion B die Sperre erwerben, was bedeutet, dass Transaktion A und Transaktion B gleichzeitig die S-Sperre des Datensatzes halten.
Intention Shared Lock(Intention Shared Lock), auch alsIS Lock bezeichnet. Wenn eine Transaktion einem Datensatz eine S-Sperre hinzufügen möchte, muss sie zunächst eine IS-Sperre auf Tabellenebene hinzufügen. Intention Exclusive Lock (Intention Exclusive Lock), auch alsIX Lock bezeichnet. Wenn eine Transaktion einem Datensatz eine X-Sperre hinzufügen möchte, muss sie zunächst eine IX-Sperre auf Tabellenebene hinzufügen. Absichtssperren sind Sperren auf Tabellenebene. Sie werden nur vorgeschlagen, um schnell zu beurteilen, ob die Datensätze in der Tabelle gesperrt sind, wenn S-Sperren auf Tabellenebene hinzugefügt werden. Es gibt keine gesperrten Datensätze in der Tabelle. Das heißt, die IS-Sperre ist mit der IS-Sperre kompatibel und die IX-Sperre ist mit der IX-Sperre kompatibel. Warum brauchen Sie eine Absichtssperre? Die Absichtssperre von InnoDB wird hauptsächlich verwendet, wenn mehrere granulare Sperren nebeneinander existieren. Beispielsweise möchte Transaktion A einer Tabelle eine S-Sperre hinzufügen. Wenn eine Zeile in der Tabelle durch Transaktion B zu einer X-Sperre hinzugefügt wurde, sollte auch die Anwendung für die Sperre blockiert werden. Wenn die Tabelle viele Daten enthält, ist der Aufwand für die zeilenweise Überprüfung des Sperrflags sehr groß und die Leistung des Systems wird beeinträchtigt. Wenn die Tabelle beispielsweise 100 Millionen Datensätze enthält und Transaktion A Zeilensperren für mehrere dieser Datensätze aufweist, muss Transaktion B der Tabelle Sperren auf Tabellenebene hinzufügen. Wenn keine beabsichtigte Sperre vorhanden ist, klicken Sie auf „Suchen“. ob diese 100 Millionen Datensätze in der Tabelle gesperrt sind. Wenn eine Absichtssperre vorliegt und Transaktion A vor der Aktualisierung eines Datensatzes eine Absichtssperre und dann eine Wenn es einen Konflikt gibt, warten Sie, bis Transaktion A freigegeben wird, ohne jeden Datensatz zu überprüfen. Wenn Transaktion B die Tabelle aktualisiert, muss sie nicht wirklich wissen, welche Zeile gesperrt ist. Sie muss lediglich wissen, dass eine Zeile ohnehin gesperrt ist. Um es ganz klar auszudrücken: Die Hauptfunktion von Absichtssperren besteht darin, den Widerspruch zwischen Zeilensperren und Tabellensperren aufzulösen. Sie können zeigen, dass eine Transaktion eine Sperre für eine bestimmte Zeile hält oder sich darauf vorbereitet, die Sperre aufrechtzuerhalten. Kompatibilität verschiedener Schlösser aufTabellenebene :
S
|
Das obige ist der detaillierte Inhalt vonMySQL lernt, über Sperren und Klassifizierung zu sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!