Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Informazioni sui LOCK di SQL Server nelle query SELECT

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.