Durante le prestazioni continui a concentrarti su selezionare.
Shared non blocca le letture.
Aggiornamento blocchi bloccati condivisi.
Se si dispone di centinaia di blocchi condivisi, è necessario attendere un aggiornamento per ottenere un blocco esclusivo in quanto deve attendere la cancellazione dei blocchi condivisi.
Per impostazione predefinita, selezionare (leggi) accetta un blocco condiviso.
I blocchi condivisi (S) consentono alle transazioni concorrenti di leggere (SELEZIONARE) una risorsa.
Un blocco condiviso come nessun effetto su altri selezioni (1 o 1000).
La differenza è il modo in cui il nolock rispetto agli effetti di blocco condiviso aggiorna o inserisce un'operazione.
Nessun'altra transazione può modificare i dati mentre i blocchi condivisi (S) esistono sulla risorsa.
Un blocco condiviso blocca un aggiornamento!
Ma nolock non blocca un aggiornamento.
Questo può avere un impatto enorme sulle prestazioni degli aggiornamenti. Influisce anche sugli inserti.
La lettura sporca (nolock) sembra solo sporca. Non otterrai mai dati parziali. Se un aggiornamento sta cambiando John in Sally, non otterrai mai Jolly.
Io uso molto i blocchi condivisi per la concorrenza. I dati sono obsoleti non appena vengono letti. Una lettura di John che cambia in Sally il prossimo millisecondo sono dati obsoleti. Una lettura di Sally che viene riportata indietro di John il secondo millisecondo è dati obsoleti. Questo è al millisecondo. Ho un dataloader che richiede 20 ore per essere eseguito se gli utenti stanno prendendo i blocchi condivisi e 4 ore per l'esecuzione è che gli utenti non stanno prendendo alcun blocco. In questo caso, i blocchi condivisi causano 16 ore di dati obsoleti.
Non utilizzare nolocks errati. Ma loro hanno un posto. Se si sta per tagliare un segno di spunta quando un byte è impostato su 1 e quindi impostarlo su 2 quando il controllo è tagliato, non un tempo per un arresto.
Bella risposta, grazie mille! Ci sarebbe un impatto (su centinaia di query 'SELECT') per usare' WITH (NOLOCK) 'senza motivo? –
Usiamo con nolock nel 99,5% dei nostri selezionati, senza scherzo. Se un amministratore sta aggiornando un record utente, non si vuole che questo causi il fatto che il report resti lì e aspetti che l'intera transazione distribuita finisca. Quindi i loro vecchi dati appaiono sul rapporto. Che importa? Se il rapporto fosse stato eseguito un secondo prima, si tratta degli stessi dati che sarebbero stati lì con il rowlock. L'unico posto che preoccupa sono i dati che non sono stati ancora impegnati. Se stai mostrando "ordini nell'ultima ora" che potrebbero potenzialmente essere un problema, ma un piccolo, piccolo problema rispetto ai guadagni di velocità/concorrenza. –
Inoltre, poiché "report" è stato buttato fuori come esempio, i report sono in genere per un periodo di tempo che non corrisponde agli ultimi 5 minuti. Segnalazione sui dati del mese scorso con nolock - beh, non è che i dati arriveranno al rollback un mese dopo. –