Sperren im Datenbankmodul

Sperren sind ein Mechanismus, der von Microsoft SQL Server Database Engine (Datenbankmodul) zum Synchronisieren des gleichzeitigen Zugriffs auf die gleichen Daten durch mehrere Benutzer verwendet wird.

Bevor eine Transaktion eine Abhängigkeit für den aktuellen Status von Daten abruft, z. B. durch Lesen oder Ändern der Daten, muss sie sich selbst vor den Auswirkungen schützen, die sich ergeben können, wenn eine andere Transaktion die gleichen Daten ändert. Die Transaktion fordert zu diesem Zweck eine Sperre für die betreffenden Daten an. Sperren besitzen verschiedene Modi, z. B. freigegeben oder exklusiv. Der Sperrmodus definiert den Grad der Abhängigkeit, den die Transaktion für die Daten eingerichtet hat. Keiner Transaktion wird eine Sperre gewährt, die einen Konflikt mit dem Modus einer Sperre verursachen würde, die einer anderen Transaktion bereits für die betreffenden Daten erteilt wurde. Wenn eine Transaktion einen Sperrmodus anfordert, der einen Konflikt mit einer Sperre verursacht, die bereits für die gleichen Daten erteilt wurde, hält die Instanz von Database Engine (Datenbankmodul) die anfordernde Transaktion an, bis die erste Sperre freigegeben wird.

Wenn eine Transaktion Daten ändert, wird die Sperre, die die Änderung schützt, aufrechterhalten, bis die Transaktion abgeschlossen ist. Die Zeitdauer der Aufrechterhaltung einer Sperre zum Schutz von Lesevorgängen durch eine Transaktion hängt von der Einstellung für die Isolationsstufe der Transaktion ab. Alle Sperren, die von einer Transaktion aufrechterhalten werden, werden freigegeben, wenn die Transaktion abgeschlossen ist (d. h. ein Commit oder ein Rollback ausgeführt wurde).

Anwendungen fordern in der Regel Sperren nicht direkt an. Sperren werden intern durch eine Komponente von Database Engine (Datenbankmodul) verwaltet, die als Sperrenmanager bezeichnet wird. Wenn eine Instanz von Database Engine (Datenbankmodul) eine Transact-SQL-Anweisung verarbeitet, ermittelt der Abfrageprozessor von Database Engine (Datenbankmodul), auf welche Ressourcen zugegriffen werden muss. Der Abfrageprozessor ermittelt, welche Arten von Sperren zum Schützen der einzelnen Ressourcen basierend auf dem Zugriffstyp und der Einstellung für den Isolationsgrad der Transaktion erforderlich sind. Der Abfrageprozessor fordert dann die entsprechenden Sperren vom Sperrenmanager an. Der Sperrenmanager erteilt die Sperren, wenn keine Sperren von anderen Transaktionen aufrechterhalten werden, die einen Konflikt verursachen.

In der folgenden Tabelle sind die Themen aufgeführt, die die Hauptkonzepte der Verwendung von Sperren beschreiben.

Thema

Beschreibung

Sperrengranularität und -hierarchien

Sperren können für verschiedene Arten von Ressourcen, z. B. für Zeilen, Seiten, Indizes, Tabellen oder Datenbanken, angefordert werden. Einige Operationen verlangen Sperren auf mehreren Granularitätsebenen, sodass eine Sperrenhierarchie entsteht.

Sperrmodi

Sperren besitzen verschiedene Modi, die die Zugriffsebenen angeben, die für andere Transaktionen für die gesperrte Ressource gelten.

Kompatibilität von Sperren (Datenbankmodul)

Mehrere Transaktionen können gleichzeitige Sperren für die gleiche Ressource abrufen, wenn ihre Sperrmodi kompatibel sind. Wenn eine Transaktion einen Sperrmodus anfordert, der einen Konflikt mit einer vorhandenen Sperre verursacht, wird die Transaktion angehalten, bis die erste Sperre freigegeben wird.

Schlüsselbereichssperren

Durch Sperren eines Bereichs von Schlüsseln können Transaktionen, die auf der serialisierbaren Isolationsstufe ausgeführt werden, Phantomeinfügungen und -löschungen verhindern.

Sperrenausweitung (Datenbankmodul)

Wenn eine Transaktion eine große Anzahl von Zeilen- oder Seitensperren abruft, kann Database Engine (Datenbankmodul) eine Tabellensperre erteilen und dann alle Sperren auf niedrigerer Ebene freigeben, um den Sperrenaufwand so gering wie möglich zu halten.

Dynamisches Sperren

Database Engine (Datenbankmodul) kann die Sperrengranularitätsebene basierend auf der durch den Optimierer geschätzten Anzahl von Zeilen dynamisch auswählen, auf die die Transact-SQL-Anweisung verweist.

Anzeigen von Sperrinformationen (Datenbankmodul)

Database Engine (Datenbankmodul) und die zugehörigen APIs stellen mehrere Mechanismen zum Anzeigen von Informationen zu den Sperren bereit, die zurzeit in einer Instanz oder Datenbank aufrechterhalten werden.

Deadlocks

Deadlocks treten auf, wenn sich zwei Tasks dauerhaft gegenseitig blockieren, weil jeder der Tasks eine Sperre für eine Ressource aufrecht erhält, die von dem anderen Task benötigt wird.