Ich habe versucht, Informationen zum Blockieren in SQL Server zu finden, konnte jedoch keine präzise Erklärung dafür finden, was es ist und wie es geschieht. Könnten Sie mich bitte aufklären?
quelle
Ich habe versucht, Informationen zum Blockieren in SQL Server zu finden, konnte jedoch keine präzise Erklärung dafür finden, was es ist und wie es geschieht. Könnten Sie mich bitte aufklären?
Analogien
Manchmal hilft es, Analogien außerhalb von Computern zu verwenden.
Nehmen wir an, Sie haben einen Ball und zwei Kinder. Es kann immer nur ein Kind den Ball haben. Wenn jedoch eines der Kinder den Ball bekommt und ihn nicht loslässt, weil er abgelenkt ist (z. B. Fernsehen), kann das andere Kind nicht mit dem Ball spielen.
Das andere Kind ist für diese Ressource gesperrt.
Wenn wir dies zum Beispiel mit dem Fernsehen vergleichen, können mehrere Kinder an einem Punkt fernsehen.
Schlösser
Wenn wir in die Datenbankwelt wechseln, sehen wir, dass es verschiedene Möglichkeiten gibt, Ressourcen zu verwenden (genau wie in unseren beiden obigen Beispielen). Wir können "Lesevorgänge" durchführen oder wir können "Schreibvorgänge" durchführen.
Wenn wir die Daten lesen wollen, gibt es keinen Grund, warum andere nicht auch die Daten lesen können - genau wie zwei Leute, die fernsehen. Wenn wir die Daten jedoch schreiben möchten, müssen wir sicherstellen, dass niemand anderes darauf schaut. Wenn sie es lesen, während wir es schreiben, erhalten sie "schmutzige" Lesungen. (Das heißt, sie sehen die Daten teilweise ausgeschrieben, was ungültig ist.)
Um sicherzustellen, dass diese unsauberen Lesevorgänge niemals auftreten, gibt es zwei Haupttypen von Sperren: Lesesperren und Exklusivsperren.
Lese Sperre
Es können zu einem bestimmten Zeitpunkt mehrere verschiedene Verbindungen aus derselben Datenquelle gelesen werden. Um sicherzustellen, dass niemand diese Daten ändert, während er sie liest, wird eine Lesesperre aufgehoben.
Sobald eine Verbindung eine Lesesperre für ein Datenelement hat, müssen alle anderen Verbindungen warten, bis die Lesesperre aufgehoben wird, bevor sie die Daten schreiben können. Andere können jedoch eigene Lesesperren für dieselben Daten entfernen.
Exklusives Schloss
Wenn eine Verbindung ein Datenelement aktualisieren, einfügen oder löschen möchte, muss sie eine exklusive Sperre aufheben. Auf diese Weise wird verhindert, dass eine andere Verbindung eine Sperre für die Daten aufhebt (wodurch die Sperre für diese Verbindung exklusiv wird).
Wenn eine Verbindung eine exklusive Sperre für die Daten hat, können möglicherweise keine anderen Verbindungen aus den Daten gelesen werden. Dies trägt dazu bei, schmutzige Lesevorgänge zu verhindern, indem sichergestellt wird, dass niemand die Daten lesen kann, während sie geschrieben werden.
Blockierung
"Blockieren" ist einfach ein Begriff, der bedeutet, dass eine Verbindung eine Ressource sperrt, wenn eine andere Verbindung darauf lesen oder schreiben möchte. Dies bedeutet nicht unbedingt, dass die Besitzerverbindung sie nicht freigibt, sondern nur, dass sie sie gerade hält.
Vergleichen Sie dies mit dem Fall eines Kindes, das den Ball hält. Das Kind, das den Ball hält, blockiert alle anderen Kinder, den Ball zu halten.
Sackgasse
Ich weiß, dass Sie das nicht gefragt haben, aber es ist nur noch ein Schritt, um zu Deadlocks zu gelangen (und es hängt sehr direkt mit dem Blockieren zusammen).
Deadlocks können auftreten, wenn Sie über zwei Verbindungen verfügen, für die jeweils eine Sperre besteht, die sich jedoch gegenseitig als Ressource verwenden sollen. In diesem Szenario haben zwei Kinder einen Ball, wollen aber den Ball des anderen.
Wie Kinder sind diese Verbindungen überhaupt nicht bereit zu teilen. Jede Verbindung benötigt Zugriff auf beide Ressourcen, um fortzufahren. Sie sind jedoch permanent blockiert. In diesem Zustand muss das übergeordnete Element (DBMS) hereinkommen und einen Verlierer auswählen, damit eines der untergeordneten Elemente (Verbindungen) Zugriff auf beide Ressourcen hat.
Sobald diese "gewinnende" Verbindung hergestellt ist, werden die Ressourcen freigegeben, und die andere ("verlierende") Verbindung kann erneut versuchen, auf beide Ressourcen zuzugreifen.
Das Konzept eines Deadlocks besteht also darin, dass Sie zwei Ressourcen haben, die sich gegenseitig blockieren.
Hier erfahren Sie mehr über die verschiedenen Arten von Sperren, die SQL Server bietet, und über die verschiedenen Ressourcen, die Blockierungen / Deadlocks verursachen können. Der Artikel ist alt, gilt jedoch weiterhin für SQL Server 2000 bis 2008 R2. (In späteren Versionen von SQL Server werden einige weitere Sperrentypen hinzugefügt, die Ihnen jedoch einen Ausgangspunkt bieten.)
Tolle Erklärung von Richard, wollte aber nur Links zur offiziellen Dokumentation hinzufügen. Diese Themen wurden für SQL Server 2000 geschrieben, aber viele der Konzepte sind bis heute dieselben:
Blockieren verstehen und vermeiden
Grundlegendes zum Sperren in SQL Server
Bearbeiten - einige Ergänzungen:
Fünf Wege, um Blocking Video zu bekämpfen - ein sehr aktuelles Video von Kendra Little (heute veröffentlicht)
Der DBA als Detektiv: Fehlerbehebung beim Sperren und Blockieren - von Rodney Landrum
Identifizieren von Blockierungsproblemen mit SQL Profiler - von Brad McGehee
Alle 3 sind sehr bekannte SQL Server-Autoren und / oder MVPs.
quelle