Ich bin sehr neu in SQL Server und würde gerne verstehen, ob die folgende, sehr einfache select
Anweisung Sperren zulässt.
Select * from Student;
Bitte betrachten Sie den Fall, in dem die Anweisung nicht in einem begin tran
Block ausgeführt werden würde.
sql-server
sql-server-2008
locking
Neuer Entwickler
quelle
quelle
Antworten:
Ja, es ist eine gemeinsame Sperre für die Zeilen erforderlich, die standardmäßig gelesen werden (es ist auch eine gemeinsame Absichtssperre für alle Seiten des zu lesenden Clustered-Index erforderlich). Es gibt jedoch Möglichkeiten, dies zu umgehen (SQL Server hat den Nolock-Hinweis). Befindet sich die Anweisung nicht in einem BEGIN TRAN, wird die Sperre freigegeben, nachdem die SELECT-Anweisung ausgeführt wurde.
Weitere Infos finden Sie hier:
http://msdn.microsoft.com/en-us/library/ms184286(v=sql.105).aspx http://www.sqlteam.com/article/introduction-to-locking-in-sql-server
quelle
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.
quelle