Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was ist SQL Server-Deadlock?

Es gibt viele Gründe, warum Anwendungen möglicherweise langsam reagieren, aber wenn sich Benutzer über die Leistung beschweren, haben Sie es möglicherweise mit einem SQL Server-Deadlock zu tun. Glücklicherweise gibt es Möglichkeiten, SQL Server-Deadlocks zu identifizieren und zu beheben und sogar zu verhindern, dass sie die Anwendungsleistung negativ beeinflussen.

SQL Server-Deadlock ist im Wesentlichen eine Pattsituation zwischen zwei Prozessen, die um den exklusiven Zugriff auf dieselbe Ressource konkurrieren. Da jeweils nur ein Prozess eine Ressource verwenden kann, verlangsamt sich die Leistung, bis der Deadlock behoben ist.

Es gibt zwei Arten von SQL Server-Deadlocks, auf die Sie achten sollten:Konvertierungssperren und Zyklussperren.

Deadlocks bei Konvertierungssperren treten auf, wenn ein Thread versucht, eine Sperre von einem exklusiven Typ in einen anderen exklusiven Typ zu konvertieren, dies jedoch nicht kann, da ein anderer Thread bereits eine gemeinsame Sperre für die Ressource hält, die der erste Thread zu konvertieren versucht.

In SQL Server gibt es drei Arten von Konvertierungssperren:

  • Gemeinsam mit exklusiver Absicht (SIX):Diese Sperre tritt auf, wenn eine Transaktion, die eine gemeinsame Sperre hält, auch eine exklusive Sperre auf einigen Seiten oder Zeilen hat.
  • Shared with Intent Update (SIU):Diese Sperre tritt auf, wenn eine Transaktion, die eine Shared-Sperre hält, auch einige Seiten oder Zeilen mit einer Update-Sperre gesperrt hat.
  • Aktualisierung mit exklusiver Absicht (UIX):Diese Sperre tritt auf, wenn eine Transaktion, die eine Aktualisierungssperre hält, auch eine exklusive Sperre für einige Seiten oder Zeilen hat.

Zyklussperren sind SQL Server-Deadlocks, die von zwei Prozessen verursacht werden, die um eine exklusive Sperre für eine Ressource wetteifern, die vom anderen Prozess gesperrt ist.

Beispielsweise hält Prozess 1 eine Sperre auf Ressource 1, während er darauf wartet, dass Prozess 2 seine Sperre auf Ressource 2 freigibt. Wenn Prozess 2 eine Sperre auf Ressource 2 hält, während er darauf wartet, dass Prozess 1 Ressource 1 freigibt, haben wir uns selbst ein Taktschleusen-Deadlock.

So diagnostizieren Sie SQL Server-Deadlocks

SQL Server-Deadlock ist nur einer von Dutzenden möglichen Gründen, warum Ihre Anwendung Leistungsprobleme haben könnte. Wenn Abfragen, die normalerweise schnell ausgeführt werden, plötzlich sehr langsam werden, ist es möglich, dass Sie einen Deadlock haben. Aber es ist auch möglich, dass etwas anderes passiert.

Abgesehen davon, dass Sie eine verringerte Abfragegeschwindigkeit bemerken, wie können Sie also mit Sicherheit feststellen, ob Deadlocks für Ihre Datenbankleistungsprobleme verantwortlich sind?

Der einfachste und eindeutigste Weg, Deadlocks zu identifizieren, ist das Vorhandensein einer 1205-Fehlermeldung:

Die Transaktion (Prozess-ID %d) war auf %.*ls-Ressourcen mit einem anderen Prozess blockiert und wurde als Deadlock-Opfer ausgewählt. Führen Sie die Transaktion erneut aus.

Die 1205-Fehlermeldung sagt Ihnen buchstäblich, dass ein Deadlock vorliegt und wie Sie ihn beheben können. Wie Jeremiah Peschka jedoch betont, wird eine erneute Ausführung der Transaktion wahrscheinlich nicht erfolgreich sein, wenn Sie die Ursache des Deadlocks nicht behoben haben.

Eine weitere Möglichkeit zum Auffinden von Deadlocks besteht darin, ein SQL Server-Deadlock-Diagramm aus Extended Events herauszuziehen. Durch das Extrahieren des Deadlocks durch erweiterte Ereignisse können Sie sich das Deadlock-XML ansehen, das mehr Informationen bietet als die grafische Darstellung eines Deadlock-Diagramms.

Die Deadlock-XML ist durch die Opferliste, die Prozessliste und die Ressourcenliste organisiert. Jeder Abschnitt enthält detaillierte Beschreibungen der Opfer, Prozesse und Ressourcen, die an dem Deadlock beteiligt sind, was die Fehlerbehebung und Lösung des Problems erleichtert.

So beheben Sie einen SQL Server-Deadlock

Die einzige Möglichkeit, einen SQL Server-Deadlock aufzulösen, besteht darin, einen der Prozesse zu beenden und die gesperrte Ressource freizugeben, damit der Prozess abgeschlossen werden kann. Dies geschieht automatisch, wenn SQL Server einen Deadlock erkennt und einen der konkurrierenden Prozesse (d. h. das Opfer) beendet.

SQL Server wählt normalerweise nach dem Zufallsprinzip aus, welche Verbindung beendet werden soll, aber es ist möglich, Deadlock-Prioritäten festzulegen, um zu bestimmen, welche Verbindung während eines Deadlocks beendet wird. Wenn zwei Verbindungen unterschiedliche Prioritätseinstellungen haben, beendet SQL Server die Transaktion mit der niedrigsten Priorität.

So verhindern Sie SQL Server-Deadlocks

SQL Server-Deadlocks sind eine Tatsache des Lebens, wenn Sie eine ausgelastete Datenbank verwalten. DBAs können jedoch dazu beitragen, das Auftreten von Deadlocks zu reduzieren und ihre Auswirkungen auf die Datenbankleistung zu minimieren, indem sie einige vorbeugende Maßnahmen ergreifen:

  • Erstellen Sie bessere Indizes
  • Transaktionsprioritäten anpassen
  • Setzen Sie ein Try/Retry-Modell ein
  • Isolationsmodi ändern
  • Sperre so kurz wie möglich halten
  • Greifen Sie jedes Mal in derselben Reihenfolge auf Ressourcen zu
  • Führen Sie keine Transaktion durch, bevor Sie nicht alle erforderlichen Informationen haben
  • Limit-Lock-Eskalation

Obwohl es nicht möglich ist, SQL Server-Deadlocks vollständig zu verhindern, können Sie diese Best Practices implementieren und einige der häufigsten Ursachen für Deadlocks proaktiv umgehen, um einen reibungslosen Transaktionsfluss zu gewährleisten und die Datenbankleistung zu optimieren.