Ich würde gerne verstehen, ob die folgende, sehr einfache select-Anweisung Sperren zulässt
Es ist ein weit verbreitetes Missverständnis, dass eine SELECT
Abfrage, die auf der Standard- READ COMMITTED
Transaktionsisolationsstufe ausgeführt wird, immer gemeinsame Sperren verwendet, um fehlerhafte Lesevorgänge zu verhindern.
SQL Server kann das Aufheben gemeinsam genutzter Sperren auf Zeilenebene vermeiden, wenn keine Gefahr besteht, nicht festgeschriebene Daten ohne diese zu lesen (obwohl weiterhin IS-Sperren (Intent-Shared) auf höherer Ebene verwendet werden).
Selbst wenn gemeinsam genutzte Zeilensperren verwendet werden (möglicherweise, weil die Seite, auf der sich die Zeile befindet, durch eine andere gleichzeitige Transaktion geändert wurde), können diese lange vor Abschluss der SELECT
Anweisung freigegeben werden .
In den meisten Fällen wird die Zeile "entsperrt", bevor der Server die nächste Zeile verarbeitet. Unter bestimmten Umständen werden gemeinsam genutzte Sperren, die auf der Standardisolationsstufe verwendet werden, bis zum Ende der aktuellen Anweisung, jedoch nicht bis zum Ende der Transaktion gespeichert .
Das Überschreiben der aktuellen Isolationsstufe mit dem NOLOCK
Tabellenhinweis ist fast immer eine schlechte Idee .
Das Sperren ist ein Implementierungsdetail. SQL Server führt bei Bedarf Sperren durch, um sicherzustellen, dass die semantischen Garantien der aktuellen Isolationsstufe eingehalten werden . Es gibt sicherlich Zeiten, in denen es nützlich ist, ein wenig darüber zu wissen, warum Sperren verwendet werden, aber der Versuch, sie vorherzusagen, ist sehr oft kontraproduktiv.
SQL Server bietet eine Vielzahl von Isolationsstufen. Wählen Sie die, die die Garantien und Verhaltensweisen bietet, die Ihre Datenkonsumenten benötigen.