Heim >Datenbank >MySQL-Tutorial >Was sind die Ursachen und Lösungen für Datenbank-Deadlocks?
Deadlock
Der sogenannte Deadlock: bezieht sich auf ein Phänomen des gegenseitigen Wartens, das dadurch verursacht wird, dass zwei oder mehr Prozesse während der Ausführung um Ressourcen konkurrieren. Wenn keine externe Kraft vorhanden ist, kann keiner von ihnen voranschreiten. Zu diesem Zeitpunkt befindet sich das System in einem Deadlock-Zustand oder es ist ein Deadlock im System aufgetreten. Diese Prozesse, die immer aufeinander warten, werden Deadlock-Prozesse genannt.
Da sich die Ressourcenbelegung gegenseitig ausschließt, werden dem betreffenden Prozess niemals die erforderlichen Ressourcen zugewiesen und er kann nicht ohne externe Hilfe weiterlaufen. Dies führt zu einem besonderen Phänomen, das als Deadlock bezeichnet wird.
Eine Situation, in der zwei oder mehr Threads im Ausführungsprogramm dauerhaft blockiert sind (warten) und jeder Thread auf Ressourcen wartet, die von anderen Threads belegt und blockiert werden. Wenn beispielsweise Thread A Datensatz 1 sperrt und auf Datensatz 2 wartet und Thread B Datensatz 2 sperrt und auf Datensatz 1 wartet, kommt es zu einem Deadlock zwischen den beiden Threads.
Wenn in einem Computersystem die Ressourcenzuweisungsstrategie des Systems falsch ist oder, was häufiger vorkommt, das vom Programmierer geschriebene Programm Fehler usw. aufweist, führt dies zu einem Stillstand des Prozesses aufgrund eines falschen Wettbewerbs um Ressourcen.
Es gibt viele Möglichkeiten, Sperren zu implementieren, z. B. Absichtssperren, gemeinsam genutzte exklusive Sperren, Sperrtabellen, Baumprotokolle, Zeitstempelprotokolle usw. Sperren haben auch mehrere Granularitäten. Sie können beispielsweise eine Tabelle oder einen Datensatz sperren.
Die Hauptgründe für einen Deadlock sind:
(1) Unzureichende Systemressourcen.
(2) Die Reihenfolge der Prozessausführung und des Fortschritts ist unangemessen.
(3) Falsche Ressourcenzuweisung usw.
Wenn die Systemressourcen ausreichend sind und die Ressourcenanforderungen des Prozesses erfüllt werden können, ist die Wahrscheinlichkeit eines Deadlocks sehr gering. Andernfalls kommt es aufgrund des Wettbewerbs um begrenzte Ressourcen zu einem Deadlock. Zweitens kann es auch zu einem Deadlock kommen, wenn die Reihenfolge und die Geschwindigkeit des Prozesses unterschiedlich sind.
Vier notwendige Bedingungen für einen Deadlock:
(1) Bedingung des gegenseitigen Ausschlusses: Eine Ressource kann jeweils nur von einem Prozess verwendet werden.
(2) Anforderungs- und Haltebedingungen: Wenn ein Prozess aufgrund der Anforderung von Ressourcen blockiert wird, behält er die erhaltenen Ressourcen.
(3) Nichtentzugsbedingung: Die durch den Prozess gewonnenen Ressourcen können nicht gewaltsam entzogen werden, bevor sie aufgebraucht sind.
(4) Zirkuläre Wartebedingung: Mehrere Prozesse bilden eine direkte zyklische Wartebeziehung auf Ressourcen.
Diese vier Bedingungen sind notwendige Bedingungen für einen Deadlock. Solange ein Deadlock im System auftritt, müssen diese Bedingungen erfüllt sein. Solange eine der oben genannten Bedingungen nicht erfüllt ist, tritt kein Deadlock auf.
Vorbeugung und Linderung von Deadlocks:
Wenn Sie die Ursachen von Deadlocks verstehen, insbesondere die vier notwendigen Bedingungen für Deadlocks, können Sie Deadlocks so weit wie möglich vermeiden, verhindern und lindern. Achten Sie daher im Hinblick auf Systemdesign, Prozessplanung usw. darauf, wie Sie verhindern können, dass diese vier notwendigen Bedingungen geschaffen werden, und wie Sie einen angemessenen Ressourcenzuweisungsalgorithmus festlegen, um zu vermeiden, dass Prozesse dauerhaft Systemressourcen belegen.
Darüber hinaus muss verhindert werden, dass der Prozess im Wartezustand Ressourcen belegt. Während des Systembetriebs wird jede vom Prozess ausgegebene Ressourcenanforderung, die das System erfüllen kann, dynamisch überprüft und basierend auf den Prüfergebnissen überprüft. Es wird entschieden, ob Ressourcen zugewiesen werden sollen. Wenn das System nach der Zuweisung blockiert, wird es nicht zugewiesen, andernfalls wird es zugewiesen. Daher muss die Ressourcenallokation richtig geplant werden.
So minimieren Sie Deadlocks
Obwohl Deadlocks nicht vollständig vermieden werden können, kann die Anzahl der Deadlocks minimiert werden. Die Minimierung von Deadlocks erhöht den Transaktionsdurchsatz und reduziert den Systemaufwand, da nur wenige Transaktionen zurückgesetzt werden, wodurch die gesamte von der Transaktion durchgeführte Arbeit rückgängig gemacht wird. Wird von der Anwendung aufgrund eines Rollbacks im Falle eines Deadlocks erneut übermittelt.
Die folgenden Methoden helfen, Deadlocks zu minimieren:
(1) Greifen Sie in derselben Reihenfolge auf Objekte zu.
(2) Vermeiden Sie Benutzerinteraktionen innerhalb von Transaktionen.
(3) Halten Sie Transaktionen kurz und in großen Mengen.
(4) Verwenden Sie eine niedrige Isolationsstufe.
(5) Bindeverbindung verwenden.
1. Greifen Sie in derselben Reihenfolge auf Objekte zu.
Wenn alle gleichzeitigen Transaktionen in derselben Reihenfolge auf Objekte zugreifen, wird die Möglichkeit eines Deadlocks verringert. Wenn beispielsweise zwei gleichzeitige Transaktionen eine Sperre für die Tabelle „Supplier“ und dann eine Sperre für die Tabelle „Part“ erhalten, wird eine Transaktion für die Tabelle „Supplier“ blockiert, bis die andere Transaktion abgeschlossen ist. Nachdem die erste Transaktion festgeschrieben oder zurückgesetzt wurde, wird die zweite Transaktion fortgesetzt. Es kommt zu keinem Deadlock. Durch die Verwendung gespeicherter Prozeduren für alle Datenänderungen wird die Reihenfolge standardisiert, in der auf Objekte zugegriffen wird.
2. Vermeiden Sie Benutzerinteraktionen in Transaktionen.
Vermeiden Sie das Schreiben von Transaktionen, die Benutzerinteraktionen beinhalten, da das Ausführen von Stapeln ohne Benutzerinteraktion viel schneller ist, als wenn Benutzer manuell auf Abfragen antworten, z. B. auf Eingabeaufforderungen für Anwendungsanforderungsparameter. Wenn beispielsweise eine Transaktion auf Benutzereingaben wartet und der Benutzer zum Mittagessen oder sogar übers Wochenende nach Hause geht, unterbricht der Benutzer die Transaktion und kann sie nicht abschließen. Dadurch wird der Durchsatz des Systems verringert, da alle von der Transaktion gehaltenen Sperren erst freigegeben werden, wenn die Transaktion festgeschrieben oder zurückgesetzt wird. Auch wenn kein Deadlock auftritt, werden andere Transaktionen, die auf dieselbe Ressource zugreifen, blockiert und warten auf den Abschluss der Transaktion.
3. Halten Sie die Transaktionen kurz und in großen Mengen
Deadlocks treten normalerweise auf, wenn mehrere Transaktionen mit langer Laufzeit gleichzeitig in derselben Datenbank ausgeführt werden. Je länger eine Transaktion ausgeführt wird, desto länger hält sie eine Exklusiv- oder Aktualisierungssperre, wodurch andere Aktivitäten blockiert werden und möglicherweise ein Deadlock verursacht wird.
Durch das Aufbewahren von Transaktionen in einem Stapel kann die Anzahl der Netzwerkkommunikations-Roundtrips für Transaktionen minimiert, mögliche Verzögerungen beim Abschluss von Transaktionen reduziert und Sperren aufgehoben werden.
4. Niedrige Isolationsstufe verwenden
Bestimmen Sie, ob die Transaktion auf einer niedrigeren Isolationsstufe ausgeführt werden kann. Durch die Durchführung eines festgeschriebenen Lesevorgangs kann eine Transaktion Daten lesen, die von einer anderen Transaktion (unverändert) gelesen wurden, ohne auf den Abschluss der ersten Transaktion warten zu müssen. Durch die Verwendung einer niedrigeren Isolationsstufe (z. B. „Read Committed“) anstelle einer höheren Isolationsstufe (z. B. „Serializable Read“) wird die Haltedauer einer gemeinsamen Sperre verkürzt und dadurch Sperrenkonflikte reduziert.
5. Verwenden Sie gebundene Verbindungen
Verwenden Sie gebundene Verbindungen, damit zwei oder mehr von derselben Anwendung geöffnete Verbindungen miteinander zusammenarbeiten können. Jede von einer sekundären Verbindung erworbene Sperre kann wie eine von der primären Verbindung erworbene Sperre gehalten werden und umgekehrt, sodass sie sich nicht gegenseitig blockieren.
6. Verwenden Sie gespeicherte Prozeduren, um den Prozess und die SQL-Anweisung herauszufinden, die den Deadlock verursacht haben.
Wie erkennen wir, welche SQL-Anweisung oder gespeicherte Prozedur den Deadlock verursacht hat? Zu diesem Zeitpunkt können wir die folgende gespeicherte Prozedur verwenden, um den Prozess und die SQL-Anweisung zu erkennen und herauszufinden, die den Deadlock verursacht haben.
Verwandte Empfehlungen: „MySQL-Tutorial“
Das obige ist der detaillierte Inhalt vonWas sind die Ursachen und Lösungen für Datenbank-Deadlocks?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!