Alles, was Sie über SQL Server-Sperren wissen müssen
Sperren werden in sperrenbasierten Parallelitätssystemen verwendet, wenn Prozesse auf Ressourcen zugreifen. Je nach Art des benötigten Zugriffs erhält ein Prozess eine logische „Sperre“. Diese Sperre weist konkurrierende Prozessen an, zu warten. Die Prozesse, die auf eine Sperre warten, sind „gesperrt“.
SQL Server ist ein sperrenbasiertes Parallelitätssystem. SQL Server-Sperren sind daher geplant und erforderlich, um die Datenintegrität zu schützen und parallele Prozesse zu ermöglichen. Sie sind normal und zu erwarten.
Sperren in SQL Server verwenden ein ausgeklügeltes Design. Dieses Design verbessert die Parallelität von Prozessen, da nicht alle Arten von Sperren alle anderen Arten von Sperren blockieren. Jede Sperre verwendet einen Modus, der dem Prozess die benötigte Zugriffsart auf die Ressource mitteilt. Der Sperrmodus legt fest, wie restriktiv die Sperre für andere Prozesse ist, und damit auch, wie wahrscheinlich es ist, dass ein Prozess eine Blockade verursacht.
Die folgende Tabelle enthält eine Liste der gängigsten Sperrmodi. (Eine vollständige Liste finden Sie in der Microsoft-Dokumentation.)
Absichtssperren werden für Änderungen verwendet. Die Sperrmodi IX oder IS werden beispielsweise häufig verwendet. Ein Sperrmodus mit einem „I“ deutet auf eine beabsichtigte Sperre hin. Mit dieser Leistungsoptimierung kann SQL Server potenzielle Kompatibilitätsprobleme im Zusammenhang mit Sperren schneller auswerten. Eine ausführlichere Erklärung von beabsichtigten Sperren finden Sie in diesem Blogbeitrag.
Die Kompatibilität von Sperren gibt an, ob ein bestimmter Sperrmodus erteilt werden kann, wenn ein bestimmter anderer Sperrmodus bereits erteilt wurde. Sperrmodi, die nicht miteinander kompatibel sind, führen zu einer Blockade.
In der folgenden Tabelle können Sie ablesen, welche Sperrtypen einander gegenseitig sperren. Die Tabelle enthält nicht alle Sperrmodi, aber Sie sollten alle im Normalfall auftretenden Modi darin finden.
Quelle: Microsoft SQL Server-Dokumentation
Die Sperrenausweitung ist ein Mechanismus in SQL Server. Dabei werden mehrere Sperren auf einer niedrigen Ebene zu weniger Sperren auf einer höheren Stufe in der Hierarchie zusammengefasst. Die Sperrenausweitung reduziert den für die Sperrenverwaltung benötigten Arbeitsspeicher. Die Arbeitsspeicherauslastung wird reduziert, da weniger Sperren für größere Bereichsobjekte anstelle von vielen Sperren für kleinere Objekte verwaltet werden.
Die Sperrenhierarchie in SQL Server ist relativ einfach. Auf der höchsten Ebene gibt es Datenbanksperren und auf der niedrigsten Ebene Zeilensperren. Falls Sie schon von Latches gehört haben, vergessen Sie diesen Mechanismus für einen Moment. Sperren und Latches haben einen ähnlichen Zweck, sind jedoch keinesfalls identisch.
Die Sperrenhierarchie für SQL Server von oben nach unten
SQL Server verwendet standardmäßig Zeilen- oder Seitensperren auf einer niedrigen Ebene. Sobald in der Sperrenverwaltung viele Sperren (ca. 5000) für dasselbe Objekt existieren, werden diese Sperren mit der Sperrenausweitung zu einer Tabellensperre ausgeweitet. Zeilensperren werden nicht zu Seitensperren ausgeweitet. Sperren werden außerdem ausgeweitet, wenn sie exklusiv (X) oder absichtlich exklusiv (IX) sind.
Die Sperrenausweitung kann für einen Server mit dem Ablaufverfolgungsflag 1211 geändert werden. Damit wird die Sperrenausweitung für den Server deaktiviert. Die ALTER TABLE-Anweisung bietet einen besseren Mechanismus zum Bearbeiten der Sperrenausweitung:
ALTER TABLE <Tabellenname> SET ( LOCK_ESCALATION = { AUTO | TABLE | DISABLE } )
Die Sperrenausweitung sollte nur mit Bedacht und zu sehr spezifischen Zwecken bearbeitet werden. Wenn Sie die Sperrenausweitung deaktivieren, wird unter Umständen unnötig viel Arbeitsspeicher verbraucht, insbesondere in transaktionalen Anwendungen mit hohem Durchsatz.
Sperren sind in SQL Server völlig normal. Die meisten kurzzeitigen Sperren erfolgen völlig unbemerkt. Manchmal dauert es länger als erwartet, bis eine Sperre behoben wird. Sperren mit längerer Dauer können zu Kettenreaktionen führen, bei denen Prozesse einander blockieren. Diese Art von Sperren ist problematisch. Die Antwort ist also Ja und Nein. Sperren sind zu erwarten, können aber auch zu Problemen führen.
Zunächst müssen Sie festlegen, ab wann eine Sperre problematisch ist. Dafür wird oft die Dauer der Sperre verwendet. Wenn Sie sich nicht sicher sind, empfehlen wir einen Ausgangswert zwischen 5 und 15 Sekunden. Mehr als 30 Sekunden ist nicht empfehlenswert, da viele Client-Frameworks standardmäßig eine Zeitüberschreitung von 30 Sekunden verwenden. Wenn ein Befehl abgebrochen wird, bevor die Sperre erkannt wird, erfahren Sie unter Umständen nicht, ob sich die zugrunde liegende Sperre auf die Benutzer der Anwendung ausgewirkt hat.
Nachdem Sie sich für eine Dauer entschieden haben, können Sie SQL Server DMVs verwenden, um nach Sperren mit einer längeren Dauer zu suchen. Die folgende einfache Abfrage verwendet die DMV „sys.dm_exec_requests“:
declare @durationInSeconds float = 5;
select
der.session_id,
der.blocking_session_id,
der.wait_type,
der.wait_time
from
sys.dm_exec_requests der
where
der.wait_time >= (@durationInSeconds * 1000)
and der.blocking_session_id != 0;
Diese Abfrage liefert eine Liste der gesperrten SPIDs mit der sperrenden SPID, dem aktuellen Wartetyp und der Wartezeit in Millisekunden. Die Abfrage verwendet einen Filter mit der Dauer, die Sie im Parameter am Anfang festlegen.
Diese Abfrage weist zwei grundsätzliche Einschränkungen auf:
Wenn wir die Einschränkungen der DMV-Abfrage beheben, können wir unser System fortlaufend auf Sperren überwachen. Dazu können wir im einfachsten Fall einen Auftrag planen, der die Ergebnisse einer DMV-Abfrage in einer Tabelle speichert. Als Alternative können Sie eine externe Leistungsüberwachungslösung für Ihre Datenbank verwenden, wie etwa SolarWinds SolarWinds SQL Sentry. SQL Sentry sammelt beispielsweise Informationen zu problematischen Sperren, erfasst den Verlauf der Sperrendetails und bereitet Sperrenketten für die Analyse grafisch auf.
Problematische SQL Server-Sperren sind oft auf dieselben Ursachen zurückzuführen.
Um die ersten beiden Gründe zu beheben, müssen Sie zunächst die Abfragen an der Spitze der Sperrenkette identifizieren. Dazu können Sie Ihre Überwachungsplattform verwenden oder DMVs analysieren. Sobald Sie die Abfragen identifiziert haben, können Sie deren Leistung optimieren, um das Sperrenproblem zu beheben. Die Leistungsoptimierung von Abfragen übersteigt den Umfang dieses Artikels, aber SQL Sentry Plan Explorer ist ein guter Ausgangspunkt.
Im Fall von verwaisten offenen Transaktionen müssen Sie die SPID identifizieren, die dazu führt, dass die Transaktion nicht geschlossen wird. Dazu können Sie die DMV sys.dm_tran_active_transactions abfragen. An dieser Stelle haben Sie eingeschränkte Optionen zur Auswahl. Wenn Sie die Abfrage identifizieren und unter Kontrolle bringen, können Sie einen Rollback ausführen. Andernfalls müssen Sie vermutlich den T-SQL-Befehl „kill“ verwenden, um den Prozess zu beenden.
Es ist nicht zwangsläufig kompliziert, SQL Server-Sperren nachzuverfolgen und zu beheben. Mit den Sperrenanalysen von SQL Sentry können Sie alle Details zu SQL-Sperren auf Basis der konfigurierten Schwellenwerte für die Sperrendauer erfassen. Sie können die Sperrenketten entweder in Echtzeit oder als Verlaufsdaten anzeigen. Informationen wie die ausgeführte Anweisung, Anmeldung, Host und Datenbank werden für alle beteiligten Prozesse angezeigt. Außerdem werden Wartetypen und wartende Ressourcen angezeigt. Sie können Sperren direkt beim Auftreten erkennen und sperrende Prozesse direkt im SQL Sentry-Client mit einem Klick beenden.
SQL Sentry speichert den Verlauf für Top SQL, gesperrte SQL- und Deadlock-Daten. Nutzen Sie die jederzeit verfügbaren Leistungsverlaufsdaten, um sich ein eindeutiges Bild des Geschehens zu verschaffen und Sperren mühelos zu beheben. Sie können sogar Reaktionen für verschiedene SQL-Sperrbedingungen konfigurieren. Bei problematischen Sperren werden Sie benachrichtigt und eine bestimmte Aktion wird gemäß Ihrer Einstellungen ausgeführt.
SQL Sentry zeigt Sperren als Hierarchie an, in der Sie die Beziehungen aller gesperrten und sperrenden SPIDs in einer SQL Server-Sperrenkette ablesen können. An den farbkodierten Knoten in der blockierenden Anweisung können Sie erkennen, ob eine Anweisung ausgeführt wird, abgeschlossen wurde oder blockiert wird.
Im SQL Sentry Event Calendar können Sie Sperren außerdem parallel zu anderen Ereignissen anzeigen. SQL Sentry bietet unglaubliche Funktionen, mit denen Sie Probleme im Zusammenhang mit SQL Server-Sperren beheben und Problemursachen schnell und effizient identifizieren können.