Diese Frage wurde mir in einem Interview gestellt und ich hatte keine Antwort. Kann hier jemand erklären?
Diese Frage wurde mir in einem Interview gestellt und ich hatte keine Antwort. Kann hier jemand erklären?
Antworten:
DB-Sperren können für Zeilen, Seiten oder ganze Tabellen oder Indizes vorhanden sein. Wenn eine Transaktion ausgeführt wird, belegen die von der Transaktion gehaltenen Sperren Ressourcen. Bei der Eskalation von Sperren führt das System mehrere Sperren auf einer höheren Ebene zusammen (z. B. mehrere Zeilensperren für eine Seite oder mehrere Seiten für eine ganze Tabelle), um Ressourcen wiederherzustellen, die von einer großen Anzahl fein abgestimmter Sperren belegt werden.
Dies wird automatisch durchgeführt, obwohl Sie Flags für die Tabellen setzen können (siehe ALTER TABLE in den Online-Büchern), um die Richtlinie für die Sperreneskalation für diese bestimmte Tabelle zu steuern. Insbesondere bei älteren Versionen von Sybase und SQL Server war eine vorzeitige oder zu eifrige Sperreneskalation ein Problem, wenn zwei Prozesse gleichzeitig separate Zeilen in dieselbe Seite schrieben. Wenn Sie weit genug zurückgehen (IIRC SQL Server 6.5) SQL Server verfügte nicht über eine Zeilensperre, sondern konnte nur Tabellen oder Seiten sperren. In diesem Fall kann es zu Konflikten zwischen Einfügungen von Datensätzen auf derselben Seite kommen. Häufig wurde ein Clustered-Index in die Tabelle eingefügt, sodass neue Einfügungen auf andere Seiten verschoben wurden.
Diese Methode reduziert den Systemaufwand, indem viele feinkörnige Sperren in weniger grobkörnige umgewandelt werden. Nähere Informationen finden Sie hier und hier .
Wenn Sie beispielsweise viele (normalerweise Hunderte oder mehr) Sperren für bestimmte Zeilen in einer Tabelle haben, werden diese möglicherweise gegen eine Sperre für die gesamte Tabelle ausgetauscht, sobald Sie die maximal zulässige Anzahl von Sperren überschritten haben.
SQL Server führt eine Sperreneskalation durch, um den Speicheraufwand zu verringern , indem mehrere fein abgestimmte Sperren auf niedriger Ebene in grob abgestimmte Sperren auf hoher Ebene konvertiert werden.
Es ist ein Mythos, dass Zeilensperren zu Seitensperren eskaliert werden. Dasselbe, das oben von @ConcernedOfTunbridgeWells erwähnt wurde, ist falsch.
Wenn eine Tabelle nur sehr wenige Zeilenaktualisierungen enthält, versucht die SQL-Engine, die Zeilensperren für diese Zeilen oder die Seitensperre für diese Seiten zu entfernen. Nehmen wir an, es hat Row-Lock gekostet. Wenn jedoch die Zeilenaktualisierung den Schwellenwert erhöht (~ 5k Sperren), wird anstelle mehrerer Zeilen-Sperren eine einzelne Tabellensperre verwendet. Auf diese Weise wird der Speicheraufwand reduziert, indem mehrere Zeilensperren aufgehoben und eine einzige Tabellensperre verwendet wird. Gleichzeitig wird jedoch die Parallelität erhöht. Gleiches passiert mit der Seitensperre.
Der Schwellenwert für die Sperreneskalation liegt bei mindestens 5000 Sperren und hängt von mehreren Faktoren ab. Eine ausführliche Erläuterung der Sperreneskalation finden Sie hier in der MSDN BoL: https://technet.microsoft.com/en-us/library/ms184286(v = sql.105) .aspx