it-swarm.com.de

Was ist Blockieren und wie passiert es?

Ich habe versucht, einige 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?

20
jrara

Analogien

Manchmal hilft es, Analogien außerhalb von Computern zu verwenden.

Angenommen, 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 es 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 Fernseher vergleichen, können mehrere Kinder gleichzeitig fernsehen.

Sperren

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" oder "Schreibvorgänge" durchführen.

Wenn wir die Daten lesen möchten, gibt es keinen Grund, warum andere die Daten nicht auch lesen können - genau wie zwei Leute, die fernsehen. Wenn wir jedoch die Daten schreiben möchten, müssen wir sicherstellen, dass niemand anderes sie betrachtet. Wenn sie es lesen, während wir es schreiben, werden sie "schmutzig" gelesen. (Das heißt, sie sehen die Daten teilweise ausgeschrieben, was ungültig ist.)

Um sicherzustellen, dass diese fehlerhaften Lesevorgänge niemals auftreten, gibt es zwei Haupttypen von Sperren: Lesesperren und exklusive Sperren.

Lesesperre

Sie können jederzeit mehrere verschiedene Verbindungen aus derselben Datenquelle lesen lassen. Um sicherzustellen, dass niemand diese Daten ändert, während er sie liest, nehmen sie eine Lesesperre auf.

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.

Exklusive Sperre

Wenn eine Verbindung ein Datenelement aktualisieren/einfügen/löschen möchte, muss sie eine exklusive Sperre aufheben. Dies verhindert, dass eine andere Verbindung die Daten ebenfalls sperrt (wodurch die Sperre nur für diese Verbindung gilt).

Wenn eine Verbindung die Daten exklusiv sperrt, dürfen keine anderen Verbindungen aus den Daten lesen. Dies hilft, schmutzige Lesevorgänge zu vermeiden, indem sichergestellt wird, dass niemand die Daten lesen kann, während sie geschrieben werden.

Blockieren

"Blockieren" ist einfach ein Begriff, der bedeutet, dass eine Verbindung eine Ressource sperrt, wenn eine andere Verbindung sie lesen oder darauf schreiben möchte. Dies bedeutet nicht unbedingt, dass die Eigentümerverbindung sie nicht freigibt, sondern nur, dass sie derzeit gehalten wird.

Vergleichen Sie dies mit dem Fall mit einem Kind, das den Ball hält. Das Kind, das den Ball hält, hindert alle anderen Kinder daran, den Ball zu halten.

Deadlock

Ich weiß, dass Sie das nicht gefragt haben, aber es ist nur ein weiterer Schritt, um zu Deadlocks zu gelangen (und es hängt sehr direkt mit dem Blockieren zusammen).

Deadlocks können auftreten, wenn Sie zwei Verbindungen haben, die jeweils eine Sperre haben, sich aber gegenseitig Ressourcen wünschen. In diesem Szenario ist es wie bei zwei Kindern, dass jedes einen Ball hat, aber den Ball des anderen will.

Wie Kinder sind diese Verbindungen überhaupt nicht bereit zu teilen. Jede Verbindung benötigt Zugriff auf beide Ressourcen, um fortzufahren. Sie befinden sich jedoch in einem permanenten Blockierungszustand. In diesem Zustand muss das übergeordnete Element (DBMS) einen Verlierer auswählen, damit eines der untergeordneten Elemente (Verbindungen) auf beide Ressourcen zugreifen kann.

Sobald diese "gewinnende" Verbindung hergestellt ist, werden die Ressourcen freigegeben, und die andere ("verlierende") Verbindung kann erneut versuchen, zu beiden Ressourcen zu gelangen.

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. (Es gibt einige weitere Arten von Sperren, die späteren Versionen von SQL Server hinzugefügt wurden, aber das gibt Ihnen einen Ausgangspunkt.)

23
Richard

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 bleiben bis heute unverändert:

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.

5
Aaron Bertrand