En SELECT
i SQL Server kommer att placera ett delat lås på en tabellrad - och en andra SELECT
skulle också kräva ett delat lås, och de är kompatibla med varandra.
Så ingen - SELECT
kan inte blockera en annan SELECT
.
Vad är WITH (NOLOCK)
frågetips som används för är att kunna läsa data som håller på att infogas (genom en annan anslutning) och som inte har registrerats än.
Utan den frågetipset, en SELECT
kan vara blockerad att läsa en tabell av en pågående INSERT
(eller UPDATE
) uttalande som placerar en exklusiv lås på rader (eller möjligen en hel tabell), tills den operationens transaktion har genomförts (eller återställts).
Problem med WITH (NOLOCK)
ledtråd är:du kanske läser datarader som inte kommer att infogas alls, till slut (om INSERT
transaktion rullas tillbaka) - så att din t.ex. rapporten kan visa data som aldrig riktigt har anslutits till databasen.
Det finns ett annat frågetips som kan vara användbart - WITH (READPAST)
. Detta instruerar SELECT
kommandot för att bara hoppa över alla rader som den försöker läsa och som uteslutande är låsta. SELECT
kommer inte att blockera, och den kommer inte att läsa någon "smutsig" oengagerad data - men den kan hoppa över vissa rader, t.ex. visa inte alla dina rader i tabellen.