Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Grundlegendes zu SQL Server LOCKS bei SELECT-Abfragen

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.