Was ist Sperren und wie geschieht es?

20

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?

jrara
quelle

Antworten:

23

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.)

Richard
quelle
1
@Richard, wie du schon erwähnt hast, wenn ein Deadlock auftritt, würde das DBMS hereinkommen und einen Verlierer auswählen. Wird dies vom DBMS automatisch durchgeführt? Oder würde ein schlecht entworfenes System (eines, bei dem häufig Deadlocks auftreten) anhalten, bis eine Person das DBMS dazu initiiert?
CenterOrbit
2
Bei SQL Server erfolgt dies automatisch (sofern die Datenbank den Deadlock erkennen kann ). Es könnte Probleme haben, es zu erkennen, wenn es sich beispielsweise tatsächlich um eine Live-Sperre handelt .
Richard
Hervorragende und sehr gründliche Antwort Richard. Ein zusätzlicher Punkt bei Live-Sperren (die eigentlich nicht mit Deadlocks verglichen werden sollten oder damit zusammenhängen, es ist einfach nur altes Sperren) ... SQL verhindert, dass weitere Sperren verwendet werden, wenn eine exklusive Sperre wartet. IIRC nach 4 aufeinanderfolgenden überlappenden gemeinsamen Sperren.
Mark Storey-Smith
5

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:

Alle 3 sind sehr bekannte SQL Server-Autoren und / oder MVPs.

Aaron Bertrand
quelle