Mysql unterstützt 3 Arten von Sperrstrukturen
InnoDB-Sperrproblem Es gibt zwei große Unterschiede zwischen InnoDB und MyISAM: Einer besteht darin, dass Transaktionen unterstützt werden (TRANSACTION); der andere ist die Verwendung von Sperren auf Zeilenebene. InnoDB-Zeilensperrmodus und Sperrmethode InnoDB implementiert die folgenden zwei Arten von Zeilensperren.
Um außerdem die Koexistenz von Zeilensperren und Tabellensperren zu ermöglichen und einen Sperrmechanismus mit mehreren Granularitäten zu implementieren, verfügt InnoDB auch über zwei intern verwendete Absichtssperren (Intention Locks), bei denen es sich beide um Tabellensperren handelt.
InnoDB-Zeilensperren werden über Indexelemente im Index implementiert. Dies unterscheidet sich von MySQL und Oracle, wo dies durch Sperren der entsprechenden Datenzeilen in den Daten implementiert wird. Diese Zeilensperrenimplementierungsfunktion von InnoDB bedeutet, dass InnoDB Zeilensperren nur beim Abrufen von Daten über Indexbedingungen verwendet, andernfalls verwendet InnoDB Tabellensperren! Next-Key-Schlösser
Wählen Sie * aus emp, wo empid > 100 für Update
Wann sollten Tabellensperren verwendet werden? Für InnoDB-Tabellen sollten in den meisten Fällen Zeilensperren verwendet werden, da Transaktionen und Zeilensperren häufig die Gründe sind, warum wir uns für InnoDB-Tabellen entscheiden. Bei einigen speziellen Transaktionen können Sie jedoch auch die Verwendung von Sperren auf Tabellenebene in Betracht ziehen. Die erste Situation ist: Die Transaktion muss die meisten oder alle Daten aktualisieren und die Tabelle ist relativ groß. Wenn die standardmäßige Zeilensperre verwendet wird, ist nicht nur die Effizienz der Transaktionsausführung gering, sondern es kann auch zu langen Sperrwartezeiten und Sperrkonflikten für andere Transaktionen kommen. In diesem Fall können Sie die Verwendung von Tabellensperren in Betracht ziehen, um die Ausführung der Transaktion zu beschleunigen. Die zweite Situation besteht darin, dass die Transaktion mehrere Tabellen umfasst, was relativ komplex ist und zu Deadlocks und Rollbacks einer großen Anzahl von Transaktionen führen kann. In diesem Fall können Sie auch in Erwägung ziehen, alle an der Transaktion beteiligten Tabellen gleichzeitig zu sperren, um Deadlocks zu vermeiden und den durch das Zurücksetzen der Transaktion verursachten Datenbank-Overhead zu verringern. Natürlich sollten von diesen beiden Transaktionstypen nicht zu viele in der Anwendung vorkommen, andernfalls sollten Sie die Verwendung der MyISAM-Tabelle in Betracht ziehen. (1) Obwohl LOCK TALBES verwendet werden kann, um Tabellensperren zu InnoDB hinzuzufügen, muss beachtet werden, dass Tabellensperren nicht von der InnoDB-Speicher-Engine-Schicht, sondern vom MySQL-Server der oberen Schicht verwaltet werden. Nur wenn autocommit=0 und innodb_table_lock=1 (Standardeinstellungen) kann die InnoDB-Schicht die von MySQL hinzugefügten Tabellensperren erkennen und MySQL Server kann die von InnoDB hinzugefügten Zeilensperren erkennen. In diesem Fall kann InnoDB Deadlocks, die Tabellensperren betreffen, automatisch identifizieren; andernfalls kann InnoDB solche Deadlocks nicht automatisch erkennen und behandeln. (2) Wenn Sie LOCAK TABLES verwenden, um InnoDB zu sperren, achten Sie darauf, AUTOCOMMIT auf 0 zu setzen, da MySQL sonst die Tabelle nicht sperrt. Verwenden Sie UNLOCAK TABLES nicht, um die Tabellensperre vor dem Ende der Transaktion freizugeben, da UNLOCK TABLES die Transaktion implizit festschreibt. COMMIT oder ROLLBACK können die von LOCAK TABLES hinzugefügte Sperre auf Tabellenebene nicht freigeben. Sie müssen UNLOCK TABLES verwenden, um die Tabellensperre freizugeben. Die richtige Methode wird in der folgenden Anweisung gezeigt. AUTOCOMMIT SETZEN=0; LOCAK-TABELLEN t1 SCHREIBEN, t2 LESEN, ...; [machen Sie etwas mit den Tabellen t1 und hier]; BEGEHEN; TABELLEN ENTSPERREN; Deadlock Mit Ausnahme von Transaktionen, die aus einer einzelnen SQL-Anweisung bestehen, werden Sperren in InnoDB schrittweise erworben, wodurch es bei InnoDB zu Deadlocks kommen kann.
(1) Wenn in einer Anwendung verschiedene Programme gleichzeitig auf mehrere Tabellen zugreifen, sollten Sie versuchen, den Zugriff auf die Tabellen in derselben Reihenfolge zu vereinbaren. Dadurch kann die Wahrscheinlichkeit eines Deadlocks erheblich verringert werden. Wenn zwei Sitzungen in unterschiedlicher Reihenfolge auf die beiden Tabellen zugreifen, ist die Wahrscheinlichkeit eines Deadlocks sehr hoch! Wenn die Zugriffe jedoch in der gleichen Reihenfolge erfolgen, können Deadlocks vermieden werden. (2) Wenn das Programm Daten stapelweise verarbeitet und die Daten im Voraus sortiert werden, um sicherzustellen, dass jeder Thread die Datensätze in einer festen Reihenfolge verarbeitet, kann die Möglichkeit eines Deadlocks erheblich verringert werden. (3) Wenn Sie während einer Transaktion einen Datensatz aktualisieren möchten, sollten Sie direkt eine Sperre mit ausreichender Stufe beantragen, d. h. eine exklusive Sperre, anstatt zuerst eine gemeinsame Sperre und dann beim Aktualisieren eine exklusive Sperre zu beantragen, was sogar zu einem Deadlock führen kann. (4) Wenn auf der Isolationsebene REPEATEABLE-READ zwei Threads gleichzeitig mit SELECT ... ROR UPDATE eine exklusive Sperre für denselben Bedingungsdatensatz hinzufügen, ist die Sperrung für beide Threads erfolgreich, wenn kein Datensatz die Bedingung erfüllt. Das Programm stellt fest, dass der Datensatz noch nicht vorhanden ist, und versucht daher, einen neuen Datensatz einzufügen. Wenn zwei Threads dies tun, kommt es zu einem Deadlock. In diesem Fall kann das Problem durch Ändern der Isolationsebene auf READ COMMITTED vermieden werden. (5) Wenn die Isolationsstufe READ COMMITED ist und beide Threads zuerst SELECT...FOR UPDATE ausführen, ermitteln sie, ob Datensätze vorhanden sind, die die Bedingungen erfüllen. Wenn nicht, fügen sie die Datensätze ein. Zu diesem Zeitpunkt kann nur ein Thread erfolgreich einfügen, und der andere Thread wartet auf die Sperre. Wenn der erste Thread übermittelt, macht der zweite Thread aufgrund des Primärschlüssels einen Fehler, aber obwohl dieser Thread einen Fehler aufweist, erhält er eine exklusive Sperre! Wenn zu diesem Zeitpunkt ein dritter Thread erneut eine exklusive Sperre beantragt, tritt ein Deadlock auf. In diesem Fall können Sie den Einfügevorgang direkt ausführen und dann die Ausnahme bezüglich der Duplizierung des Primärschlüssels abfangen. Wenn ein Fehler bezüglich der Duplizierung des Primärschlüssels auftritt, führen Sie immer ROLLBACK aus, um die erworbene exklusive Sperre freizugeben. Unterschiede zwischen MyISAM und InnoDB Für MyISAM-Tabellensperren gibt es hauptsächlich die folgenden Punkte (1) Gemeinsam genutzte Lesesperren (S) sind untereinander kompatibel, jedoch schließen sich gemeinsam genutzte Lesesperren (S) und exklusive Schreibsperren (X) sowie exklusive Schreibsperren (X) gegenseitig aus, so dass Lesen und Schreiben seriell erfolgen. Für InnoDB-Tabellen gibt es folgende Hauptpunkte (1) Die Vermarktung von InnoDB basiert auf Indizes. Wenn auf Daten nicht über einen Index zugegriffen wird, verwendet InnoDB eine Tabellensperre. Nachdem Benutzer die Sperreigenschaften von InnoDB verstanden haben, können sie Sperrkonflikte und Deadlocks durch Design- und SQL-Anpassungsmaßnahmen reduzieren, darunter:
MySql optimistische Sperre pessimistische Sperre Pessimistische Sperre Das Merkmal der pessimistischen Sperre besteht darin, dass zuerst die Sperre erworben und dann der Geschäftsvorgang ausgeführt wird. Mit anderen Worten, es ist "pessimistisch", zu glauben, dass der Erwerb der Sperre sehr wahrscheinlich fehlschlägt. Daher muss sichergestellt werden, dass die Sperre erfolgreich erworben wurde, bevor der Geschäftsvorgang ausgeführt wird. Das sogenannte „eine Sperre, zwei Prüfungen und drei Aktualisierungen“ bezieht sich normalerweise auf die Verwendung pessimistischer Sperren. Im Allgemeinen erfordert das pessimistische Sperren einer Datenbank Unterstützung durch die Datenbank selbst, d. h. das pessimistische Sperren wird durch die häufig verwendete Auswahl ... für Aktualisierungsvorgänge implementiert. Wenn die Datenbank Select for Update ausführt, erhält sie die Zeilensperre der ausgewählten Datenzeile. Wenn daher andere gleichzeitig ausgeführte Select for Update-Versuche dieselbe Zeile auszuwählen versuchen, werden sie ausgeschlossen (müssen warten, bis die Zeilensperre aufgehoben wird), wodurch der Sperreffekt erzielt wird. Die durch „Select for Update“ erworbene Zeilensperre wird am Ende der aktuellen Transaktion automatisch freigegeben und muss daher innerhalb einer Transaktion verwendet werden. Hierbei ist zu beachten, dass verschiedene Datenbanken unterschiedliche Implementierungen und Unterstützungen für „Select for Update“ haben. Oracle unterstützt beispielsweise „Select for Update no wait“, was bedeutet, dass, wenn die Sperre nicht erhalten werden kann, sofort ein Fehler gemeldet wird, anstatt zu warten. MySQL verfügt nicht über die Option „no wait“. Ein weiteres Problem mit MySQL besteht darin, dass während der Ausführung der Select for Update-Anweisung alle gescannten Zeilen gesperrt werden, was leicht zu Problemen führen kann. Wenn Sie in MySQL pessimistische Sperren verwenden, achten Sie daher darauf, den Index und nicht einen vollständigen Tabellenscan zu verwenden. Optimistisches Sperren Die Besonderheit der optimistischen Sperrung besteht darin, dass zuerst Geschäftsvorgänge ausgeführt werden und die Sperre nur dann aufgehoben wird, wenn dies unbedingt erforderlich ist. Das heißt, wir gehen „optimistisch“ davon aus, dass das Erhalten der Sperre höchstwahrscheinlich erfolgreich sein wird, sodass wir die Sperre nur im letzten Schritt des Geschäftsvorgangs erhalten müssen, der die Daten tatsächlich aktualisiert. Die Implementierung der optimistischen Sperre auf der Datenbank ist völlig logisch und erfordert keine besondere Unterstützung durch die Datenbank. Der allgemeine Ansatz besteht darin, den zu sperrenden Daten eine Versionsnummer oder einen Zeitstempel hinzuzufügen und dies dann wie folgt umzusetzen: 1. WÄHLEN Sie Daten als alte Daten, Version als alte Version von …; 2. Führen Sie Geschäftsvorgänge basierend auf den erfassten Daten durch, um neue Daten und eine neue Version zu erhalten 3. UPDATE SET Daten = neue Daten, Version = neue Version WHERE Version = alte Version if (aktualisierte Zeile > 0) { // Der optimistische Sperrerwerb war erfolgreich, der Vorgang ist abgeschlossen} else { // Der Erwerb der optimistischen Sperre ist fehlgeschlagen. Rollback und erneuter Versuch} Beim Aktualisieren derselben Zeile in der Datenbank ist keine Parallelität zulässig. Das heißt, jedes Mal, wenn die Datenbank eine Update-Anweisung ausführt, erhält sie die Schreibsperre der aktualisierten Zeile und gibt sie erst frei, wenn die Zeile erfolgreich aktualisiert wurde. Daher wird vor der Durchführung des Geschäftsvorgangs die aktuelle Versionsnummer der zu sperrenden Daten ermittelt. Wenn die Daten dann tatsächlich aktualisiert werden, wird die Versionsnummer erneut verglichen, um zu bestätigen, dass sie mit der zuvor ermittelten übereinstimmt. Anschließend wird die Versionsnummer aktualisiert, um zu bestätigen, dass in der Zwischenzeit keine gleichzeitigen Änderungen vorgenommen wurden. Wenn das Update fehlschlägt, kann davon ausgegangen werden, dass die alte Version der Daten gleichzeitig geändert wurde und nicht mehr vorhanden ist. Zu diesem Zeitpunkt wird davon ausgegangen, dass der Sperrerwerb fehlgeschlagen ist und der gesamte Geschäftsvorgang zurückgesetzt werden muss. Der gesamte Vorgang kann bei Bedarf erneut versucht werden.
Oben finden Sie eine ausführliche Erläuterung der Sperrstruktur in MySQL. Weitere Informationen zur MySQL-Sperrstruktur finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Detaillierte Schritte zur Verwendung von Jib für die Docker-Bereitstellung in Spring Cloud
In diesem Artikel wird der spezifische JavaScript...
Inhaltsverzeichnis Was sind unveränderliche Werte...
Inhaltsverzeichnis 1. Statische Implementierungsm...
Verwendung: Datum [Optionen]... [+Format] oder: D...
Hier sind einige Beispiele, wie ich diese Eigensch...
Inhaltsverzeichnis Vorwort 1. Array-Traversal-Met...
0. Vorbereitende Maßnahmen Deaktivieren Sie den s...
1. Schritte zur Installation des RPM-Pakets: 1. S...
Dieser Artikel beschreibt anhand von Beispielen, ...
Dieser Artikel beschreibt die MySQL-Einzeltabelle...
In diesem Artikel wird der spezifische Code für J...
Fehlerbeschreibung: 1. Nach der Installation von ...
Inhaltsverzeichnis Vorne geschrieben Umgebungsber...
1.vue-Verpackung Hier verwenden wir den Befehl „v...
Xrdp ist eine Open-Source-Implementierung des Rem...