Un SELECT
in SQL Server verrà posizionato un blocco condiviso su una riga della tabella - e un secondo SELECT
richiederebbe anche un blocco condiviso e quelli sono compatibili tra loro.
Quindi nessuno - uno SELECT
non può bloccare un altro SELECT
.
Cosa è il WITH (NOLOCK)
l'hint di query viene utilizzato per poter leggere i dati che sono in fase di inserimento (da un'altra connessione) e che non sono stati ancora salvati.
Senza quel suggerimento per la query, un SELECT
potrebbe essere bloccato nella lettura di una tabella da un INSERT
in corso (o UPDATE
) istruzione che inserisce un'esclusiva bloccare le righe (o eventualmente un'intera tabella), fino a quando la transazione di tale operazione non è stata salvata (o annullata).
Problema del WITH (NOLOCK)
il suggerimento è:potresti leggere righe di dati che non verranno affatto inserite, alla fine (se il INSERT
transazione viene annullata) - quindi il tuo, ad es. report potrebbe mostrare dati che non sono mai stati realmente salvati nel database.
C'è un altro suggerimento per la query che potrebbe essere utile:WITH (READPAST)
. Questo indica il SELECT
comando per saltare semplicemente tutte le righe che tenta di leggere e che sono bloccate esclusivamente. Il SELECT
non si bloccherà e non leggerà alcun dato "sporco" non impegnato, ma potrebbe saltare alcune righe, ad es. non mostra tutte le tue righe nella tabella.