2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Inhaltsverzeichnis
1. Kurze Beschreibung der Datenbanksperren
2. Kurze Beschreibung der Spaltsperre
3. Wie Sperren auf Zeilenebene in InnoDB implementiert werden
4. Unter welchen Umständen kommt es zu einem Deadlock in der Datenbank?
5. Beschreiben Sie kurz die Lösung für den Datenbank-Deadlock
Sperren sind ein Schlüsselmerkmal, das Datenbanksysteme von Dateisystemen unterscheidet. Der Sperrmechanismus wird verwendet, um den gleichzeitigen Zugriff auf gemeinsam genutzte Ressourcen zu verwalten. Nehmen wir als Beispiel die InnoDB-Engine der MySQL-Datenbank, um die Eigenschaften von Sperren kurz vorzustellen.
Wenn eine Transaktion T1 die gemeinsame Sperre von Zeile r erhalten hat, kann eine andere Transaktion T2 sofort die gemeinsame Sperre von Zeile r erhalten, da der Lesevorgang die Daten von Zeile r nicht ändert. Diese Situation wird als Sperrkompatibilität bezeichnet.Wenn jedoch eine andere Transaktion T3 die exklusive Sperre für Zeile r erhalten möchte, muss sie warten, bis die Transaktionen T1 und T2 die gemeinsame Sperre für Zeile r freigebenSperre inkompatibel . Die folgende Abbildung zeigt die Kompatibilität von gemeinsam genutzten Sperren und exklusiven Sperren. Es kann festgestellt werden, dass die X-Sperre mit keiner Sperre kompatibel ist, während die S-Sperre nur mit der S-Sperre kompatibel ist. Es ist wichtig zu beachten, dass sowohl die S-Sperre als auch die X-Sperre Zeilensperren sind und dass sich Kompatibilität auf die Kompatibilität von Sperren für denselben Datensatz (Zeile) bezieht.
X | S | |
X | Nicht kompatibel | Nicht kompatibel |
S | Nicht kompatibel | kompatibel |
Granularität sperren : Die InnoDB-Speicher-Engine unterstützt Sperren mit mehreren Granularitäten, wodurch Transaktionen gleichzeitig Sperren auf Zeilenebene und Sperren auf Tabellenebene haben können. Um Sperrvorgänge mit unterschiedlichen Granularitäten zu unterstützen, unterstützt die InnoDB-Speicher-Engine eine zusätzliche Sperrmethode namens Intention Locking. Absichtssperren unterteilen gesperrte Objekte in mehrere Ebenen. Absichtssperren bedeuten, dass Transaktionen mit einer feineren Granularität gesperrt werden sollen.
Die InnoDB-Speicher-Engine unterstützt ein relativ einfaches Design von Absichtssperren, und ihre Absichtssperren sind Sperren auf Tabellenebene. Der Hauptzweck des Entwurfs besteht darin, die Art der Sperre anzuzeigen, die für die nächste Zeile in einer Transaktion angefordert wird. Es unterstützt zwei Arten von Absichtssperren:
1. Intent Shared Lock (IS Lock): Die Transaktion möchte gemeinsame Sperren für bestimmte Zeilen in einer Tabelle erhalten.
2. Absichtliche exklusive Sperre (IX-Sperre): Die Transaktion möchte exklusive Sperren für bestimmte Zeilen in einer Tabelle erhalten.
Da die InnoDB-Speicher-Engine Sperren auf Zeilenebene unterstützt, blockieren Absichtssperren tatsächlich keine Anforderungen außer vollständigen Tabellenscans. Die Kompatibilität von Absichtssperren auf Tabellenebene und Sperren auf Zeilenebene ist also wie folgt:
ISTT | IX | S | X | |
ISTT | kompatibel | kompatibel | kompatibel | Nicht kompatibel |
IX | kompatibel | kompatibel | Nicht kompatibel | Nicht kompatibel |
S | kompatibel | Nicht kompatibel | kompatibel | Nicht kompatibel |
X | Nicht kompatibel | Nicht kompatibel | Nicht kompatibel | Nicht kompatibel |
Sperralgorithmus: Die InnoDB-Speicher-Engine verfügt über drei Zeilensperralgorithmen:
1. Datensatzsperre: Sperren Sie einen einzelnen Zeilendatensatz.
2. Lückensperre: Lückensperre, Sperre
3. Next-Key Lock: Gap Lock+Record Lock, sperren Sie einen Bereich und sperren Sie den Datensatz selbst.
Die Datensatzsperre sperrt immer Indexdatensätze. Wenn die InnoDB-Speicher-Engine-Tabelle bei ihrer Erstellung nicht mit einem Index eingerichtet ist, verwendet die InnoDB-Speicher-Engine den impliziten Primärschlüssel zum Sperren. Next-Key Lock ist ein Sperralgorithmus, der Gap Lock und Record Lock kombiniert. Unter dem Next-Key Lock-Algorithmus verwendet InnoDB diesen Sperralgorithmus für Zeilenabfragen. Die Sperrtechnologie, die Next-Key Lock verwendet, wird als Next-Key Locking bezeichnet und ist nicht dazu gedacht, das Phantomproblem (Phantomlesung) zu lösen. Mit dieser Sperrtechnologie wird nicht ein einzelner Wert, sondern ein Bereich gesperrt, was eine Verbesserung von Predict Lock darstellt.
Über Deadlock : Deadlock bezieht sich auf das Phänomen, dass zwei oder mehr Transaktionen aufgrund des Wettbewerbs um Ressourcen während der Ausführung aufeinander warten. Ohne äußere Gewalt werden die Dinge nicht vorankommen können.
Schloss-Upgrade :Sperreneskalation bezieht sich auf die Reduzierung der Granularität der aktuellen Sperre. Beispielsweise kann die Datenbank die 1.000 Zeilensperren einer Tabelle auf eine Seitensperre oder eine Seitensperre auf eine Tabellensperre umrüsten.
Bei der InnoDB-Speicher-Engine gibt es keine Sperraktualisierungsprobleme. Da keine Zeilensperren basierend auf jedem Datensatz generiert werden, werden die Sperren im Gegenteil basierend auf jeder Seite verwaltet, auf die jede Transaktion zugreift, und zwar mithilfe einer Bitmap-Methode. Daher sind die Kosten normalerweise gleich, unabhängig davon, ob eine Transaktion einen oder mehrere Datensätze auf der Seite sperrt.
Die InnoDB-Speicher-Engine verfügt über drei Zeilensperralgorithmen, und die Lückensperre (Gap Lock) ist einer davon. Lückensperren werden zum Sperren eines Bereichs verwendet, nicht jedoch der Datensätze selbst. Sein Zweck besteht darin, zu verhindern, dass mehrere Transaktionen Datensätze in denselben Bereich einfügen, was zu Phantomleseproblemen führen kann.
Die InnoDB-Sperre auf Zeilenebene wird durch das Sperren von Indexeinträgen im Index implementiert. InnoDB verwendet Sperren auf Zeilenebene nur, wenn Daten über Indexbedingungen abgerufen werden, andernfalls verwendet InnoDB Tabellensperren.
Wenn bestimmte Zeilen in einer Tabelle gesperrt sind, können verschiedene Transaktionen unterschiedliche Indizes verwenden, um unterschiedliche Zeilen zu sperren. Unabhängig davon, ob ein Primärschlüsselindex, ein eindeutiger Index oder ein gewöhnlicher Index verwendet wird, verwendet InnoDB außerdem Zeilensperren, um die Daten zu sperren.
Unter Deadlock versteht man ein Phänomen, bei dem zwei oder mehr Transaktionen aufgrund der Konkurrenz um Ressourcen während der Ausführung aufeinander warten. Ohne äußere Gewalt werden die Dinge nicht vorankommen können.Die folgende Tabelle zeigt eine klassische Deadlock-Situation, das heißt, A wartet auf B und B wartet auf A. Dieses Deadlock-Problem wird aufgerufenAB-BA-Deadlock。
Zeit | Sitzung A | Sitzung B |
1 | BEGINNEN: | |
2 | mysql>SELECT * FROM t WO a = 1 FÜR UPDATE; ************1.Reihe************ ein: 1 1 Zeile im Satz (0,00 Sekunde) | BEGINNEN: |
3 | mysql>SELECT * FROM t WO a = 2 FÜR UPDATE; ************1.Reihe************ ein:2 1 Zeile im Satz (0,00 Sekunde) | |
4 | mysql>SELECT * FROM t WO a = 2 FÜR UPDATE; #Warten | |
5 | mysql>SELECT * FROM t WO a = 1 FÜR UPDATE; FEHLER 1213(40001): Beim Versuch, eine Sperre zu erhalten, wurde ein Deadlock festgestellt. Versuchen Sie, die Transaktion neu zu starten. |
Der einfachste Weg, das Deadlock-Problem zu lösen, ist eine Zeitüberschreitung. Das heißt, wenn zwei Transaktionen aufeinander warten und eine Wartezeit einen festgelegten Schwellenwert überschreitet, wird eine der Transaktionen zurückgesetzt und die andere wartende Transaktion kann fortgesetzt werden.
Zusätzlich zum Timeout-Mechanismus verwenden aktuelle Datenbanken im Allgemeinen auch die Methode „Wait-for-Graph“ (Wartediagramm) zur Deadlock-Erkennung. Dies ist ein proaktiverer Ansatz zur Deadlock-Erkennung als die Timeout-Lösung. Dieser Ansatz wird auch von der InnoDB-Speicher-Engine übernommen. Für das Wartediagramm muss die Datenbank die folgenden zwei Arten von Informationen speichern:
1. Liste der Sperrinformationen;
2. Warteliste für Transaktionen;
Ein Diagramm kann über die oben verknüpfte Liste erstellt werden. Wenn sich in diesem Diagramm eine Schleife befindet, bedeutet dies, dass ein Deadlock vorliegt, sodass Ressourcen aufeinander warten. Dies ist ein aktiverer Deadlock-Erkennungsmechanismus. Wenn jede Transaktion eine Sperre anfordert, wird festgestellt, ob eine Schleife vorliegt. Im Allgemeinen entscheidet sich die InnoDB-Speicher-Engine dafür, die Transaktion zurückzusetzen die kleinste Menge an Rückgängigmachen.