Wenn der Client lange Zeit zum Empfangen von Daten benötigt und dann eine Bestätigung an SQL Server sendet, dass er die Daten empfangen hat, die SQL Server warten muss, gibt SQL Server aufgrund dieser Wartezeit die von der Abfrage gehaltenen Sperren nur dann frei, wenn eine Bestätigung vom Client eingeht.
Dies ist nicht genau, es hängt von der Isolationsstufe ab.
Standardmäßig READ COMMITTED
werden für die Dauer der Anweisungsausführung keine Sperren gehalten. READ COMMITTED
Keine Lesekonsistenz auf Anweisungsebene. Die einzige Garantie besteht darin, dass Sie keine nicht festgeschriebenen Daten lesen können. Eine gemeinsam genutzte Sperre wird erfasst und gehalten, um die Zeile zu lesen, und dann freigegeben.
Es sei denn, Sie haben LOB-Typen.
LOB-Typen, die möglicherweise sehr groß sind, können nicht gepuffert werden. Eine gemeinsam genutzte Sperre muss erworben und gehalten werden, bis die Anweisung vollständig ist, was im Wesentlichen zu einem REPEATABLE READ
Verhalten bei führt READ COMMITTED
.
Wenn ich eine MSSQL-Datenbank über ein Netzwerk mit hoher Latenz einzeln aufrufe, treten aufgrund dieser Latenz Tabellensperren auf?
Die Latenz verursacht nicht die Tabellensperre, nein. Wenn jedoch eine Tabellensperre erworben wurde, wird diese durch die Latenz verlängert.
Um jemanden zu zitieren, der die Mechanik besser kennt als ich ( @RemusRusanu ):
Die Ergebnisse werden im Verlauf der Ausführung an das Client-Programm zurückgegeben. Wenn Zeilen den Ausführungsbaum sprudeln lassen, muss der Top-Operator diese Zeilen normalerweise in Netzwerkpuffer schreiben und an den Client zurücksenden. Das Ergebnis wird nicht zuerst in einem Zwischenspeicher (Speicher oder Datenträger) erstellt und dann an den Client zurückgesendet, sondern beim Erstellen (während der Ausführung der Abfrage) zurückgesendet. Das Zurücksenden des Ergebnisses an den Client unterliegt natürlich dem Netzwerkflusssteuerungsprotokoll. Wenn der Client das Ergebnis nicht aktiv konsumiert (z. B. durch Aufrufen von SqlDataReader.Read ()), muss die Ablaufsteuerung die sendende Seite (die gerade ausgeführte Abfrage) sperren, und dies wiederum setzt die Ausführung von aus Abfrage.[Quelle]
Wenn die Ergebnisse nicht so schnell verbraucht werden, wie SQL Server sie liefern kann, sei es aufgrund des Clients oder des Netzwerks, ASYNC_NETWORK_IO
häufen sich die Wartezeiten. Dies hat, um es noch einmal zu wiederholen, keinen Einfluss auf die erworbenen Sperren, sondern nur auf die Dauer, für die sie gehalten werden.
nolock
Hinweis angeben , wird immer eine Sperre angezeigt . Die Latenz bestimmt nur, wie lange die Sperre gehalten wird.