Ein SELECT
in SQL Server platziert eine gemeinsame Sperre auf einer Tabellenzeile - und ein zweites SELECT
würde auch eine gemeinsame Sperre erfordern, und diese sind miteinander kompatibel.
Also kein - ein SELECT
kann kein anderes SELECT
blockieren .
Was zum WITH (NOLOCK)
Der Abfragehinweis wird verwendet, um Daten lesen zu können, die gerade eingefügt werden (von einer anderen Verbindung) und die noch nicht festgeschrieben wurden.
Ohne diesen Abfragehinweis ein SELECT
könnte das Lesen einer Tabelle durch ein andauerndes INSERT
blockiert werden (oder UPDATE
)-Anweisung, die ein exclusive platziert Zeilen (oder möglicherweise eine ganze Tabelle) sperren, bis die Transaktion dieser Operation festgeschrieben (oder rückgängig gemacht) wurde.
Problem des WITH (NOLOCK)
Hinweis:Möglicherweise lesen Sie Datenzeilen, die am Ende gar nicht eingefügt werden (wenn die INSERT
Transaktion wird zurückgesetzt) - so dass Ihre z.B. Der Bericht zeigt möglicherweise Daten an, die nie wirklich in die Datenbank übernommen wurden.
Es gibt noch einen weiteren Abfragehinweis, der nützlich sein könnte – WITH (READPAST)
. Dies weist den SELECT
an Befehl, nur alle Zeilen zu überspringen, die er zu lesen versucht und die exklusiv gesperrt sind. Die SELECT
wird nicht blockieren, und es werden keine "schmutzigen" nicht festgeschriebenen Daten gelesen - aber es können einige Zeilen übersprungen werden, z. nicht alle Zeilen in der Tabelle anzeigen.