Een SELECT
in SQL Server plaatst een gedeeld slot op een tabelrij - en een tweede SELECT
zou ook een gedeeld slot vereisen, en die zijn compatibel met elkaar.
Dus niemand - niemand SELECT
kan geen andere SELECT
blokkeren .
Wat de WITH (NOLOCK)
query-hint wordt gebruikt om gegevens te kunnen lezen die worden ingevoegd (door een andere verbinding) en die nog niet zijn vastgelegd.
Zonder die vraaghint, een SELECT
kan worden geblokkeerd bij het lezen van een tabel door een lopende INSERT
(of UPDATE
) verklaring die een exclusieve . plaatst lock op rijen (of mogelijk een hele tabel), totdat de transactie van die operatie is gepleegd (of teruggedraaid).
Probleem van de WITH (NOLOCK)
hint is:u leest mogelijk gegevensrijen die uiteindelijk helemaal niet worden ingevoegd (als de INSERT
transactie wordt teruggedraaid) - zodat uw b.v. rapport kan gegevens tonen die nooit echt zijn vastgelegd in de database.
Er is nog een vraaghint die nuttig kan zijn - WITH (READPAST)
. Dit instrueert de SELECT
commando om alle rijen over te slaan die het probeert te lezen en die exclusief zijn vergrendeld. De SELECT
blokkeert niet en leest geen "vuile" niet-toegewezen gegevens - maar het kan enkele rijen overslaan, b.v. laat niet al je rijen in de tabel zien.