sql >> Databasteknik >  >> RDS >> Sqlserver

Förstå SQL Server LOCKS på SELECT-frågor

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.



  1. Kan inte ansluta till lokal PostgreSQL

  2. Oracle:spelar kolumnordningen någon roll i ett index?

  3. Kontrollera Oracle RAC Network och IP-information

  4. uppdatera tabellrader i postgres med hjälp av subquery