La ctriggers pratica di NOLOCK (Sql Server) è ctriggers?

Sono nel business della creazione di siti Web e applicazioni che non sono mission critical -> ad es. software bancario, volo spaziale, applicazione per il monitoraggio intensivo, ecc. Hai un’idea.

Quindi, con questo enorme disclaimer, è sbagliato usare l’hint NOLOCK in qualche istruzione Sql? Un certo numero di anni fa, è stato suggerito da un altro amministratore Sql che dovrei usare NOLOCK se sono contento di una “lettura sporca” che mi darà un po ‘più di prestazioni dal mio sistema perché ogni lettura non blocca il riga / tabella / qualunque cosa.

Mi è stato anche detto che è un’ottima soluzione se mi trovo in una situazione di blocco. Così, ho iniziato a seguire quel pensiero per alcuni anni fino a quando un guru di Sql mi stava aiutando con del codice casuale e ho notato tutti i NOLOCKS nel mio codice sql. Sono stato educatamente rimproverato e ha cercato di spiegarmelo (perché non è una buona cosa) e mi sono perso. Sentivo che l’essenza della sua spiegazione era “è una soluzione di cerotto per un problema più serio .. specialmente se stai sperimentando un deadlocking. Come tale, correggi la radice del problema “.

Di recente ho fatto qualche ricerca su google e mi sono imbattuto in questo post .

Quindi, alcuni sql db guru sensei possono illuminarmi?

Con l’hint NOLOCK, il livello di isolamento della transazione per l’istruzione SELECT è READ UNCOMMITTED . Ciò significa che la query potrebbe visualizzare dati sporchi e incoerenti.

Questa non è una buona idea da applicare come regola. Anche se questo comportamento di lettura sporca è OK per l’applicazione basata su Web mission-critical, una scansione NOLOCK può causare l’errore 601 che interromperà la query a causa dello spostamento dei dati a causa della mancanza di protezione di blocco.

Suggerisco di leggere quando l’isolamento dell’istantanea aiuta e quando fa male : MSDN raccomanda l’uso di READ COMMITTED SNAPSHOT piuttosto che SNAPSHOT nella maggior parte dei casi.

Prima di lavorare su Stack Overflow, ero contraria a NOLOCK sul principal che potevi potenzialmente eseguire un SELECT con NOLOCK e ottenere risultati con dati che potrebbero non essere aggiornati o incoerenti. Un fattore da considerare è il numero di record che possono essere inseriti / aggiornati nello stesso momento in cui un altro processo può selezionare i dati dalla stessa tabella. Se questo accade molto, allora c’è un’alta probabilità di deadlock a meno che non si usi una modalità di database come READ COMMITED SNAPSHOT .

Da allora ho cambiato la mia prospettiva sull’uso di NOLOCK dopo aver visto come può migliorare le prestazioni di SELECT così come eliminare deadlock su un SQL Server caricato in massa. Ci sono momentjs in cui non ti interessa che i tuoi dati non siano esattamente commessi al 100% e hai bisogno di risultati immediati anche se potrebbero non essere aggiornati.

Porsi una domanda quando pensi di usare NOLOCK :

La mia query include una tabella con un numero elevato di comandi INSERT / UPDATE e mi interessa se i dati restituiti da una query potrebbero perdere queste modifiche in un dato momento?

Se la risposta è no, usa NOLOCK per migliorare le prestazioni.


Ho appena eseguito una ricerca rapida per la parola chiave NOLOCK all’interno del code base per Stack Overflow e trovato 138 istanze, quindi lo usiamo in diversi punti.

Se non ti importa delle letture sporche (cioè in una situazione prevalentemente READ), allora NOLOCK va bene.

MA , tieni presente che la maggior parte dei problemi di blocco è dovuta al fatto di non avere gli indici ‘corretti’ per il carico di lavoro della query (presupponendo che l’hardware sia all’altezza dell’attività).

E la spiegazione del guru era corretta. Di solito è una soluzione di cerotto per un problema più serio.

Edit : Non sto assolutamente suggerendo che NOLOCK dovrebbe essere usato. Credo che avrei dovuto farlo chiaramente chiaro. (Lo userei sempre e solo, in circostanze estreme in cui avevo analizzato che era OK). Come esempio, un po ‘di tempo fa ho lavorato su alcuni TSQL che erano stati cosparsi di NOLOCK per cercare di risolvere i problemi di blocco. Li ho rimossi tutti, implementato gli indici corretti e TUTTI i deadlock sono andati via.

Dubitavo che fosse un “guru” che aveva avuto esperienza nel traffico intenso …

I siti web sono solitamente “sporchi” quando la persona sta visualizzando la pagina completamente caricata. Considera un modulo che carica dal database e poi salva i dati che sono stati modificati ?? È stupido il modo in cui la gente continua a leggere le letture sporche come se fosse un no.

Detto questo, se hai un numero di livelli che si costruiscono sui tuoi contatti, potresti build in una pericolosa ridondanza. Se hai a che fare con denaro o scenari di status, allora non hai bisogno solo di lettura / scrittura di dati transazionali, ma di una soluzione di concorrenza adeguata (qualcosa che la maggior parte dei “guru” non si preoccupa di fare).

D’altra parte, se hai una ricerca avanzata di prodotti per un sito web (ad esempio qualcosa che probabilmente non verrà memorizzato nella cache e sarà un po ‘intensivo) e hai mai costruito un sito con più di pochi utenti concorrenti (fenomenale “esperti” non hanno), è ridicolo a imbucare ogni altro processo dietro di esso.

Sapere cosa significa e usarlo quando appropriato. Il tuo database sarà quasi sempre il tuo principale ostacolo in questi giorni e essere intelligente nell’usare NOLOCK può farti risparmiare migliaia di infrastrutture.

EDIT: Non è solo la situazione di stallo che ti aiuta, è anche quanto stai facendo aspettare a tutti gli altri finché non hai finito, o viceversa.

Usando NOLOCK Suggerimento in EF4?

Nessuna delle risposte è sbagliata, tuttavia un po ‘di confusione forse.

  • Quando si eseguono query su valori / righe singoli, è sempre una ctriggers pratica utilizzare NOLOCK: probabilmente non si desidera visualizzare informazioni errate o eseguire azioni sui dati errati.
  • Quando si visualizzano informazioni statistiche approssimative, NOLOCK può essere molto utile. Prendete come esempio SO: Sarebbe assurdo prendere i lucchetti per leggere il numero esatto di visualizzazioni di una domanda o il numero esatto di domande per un tag. Non importa a nessuno se dichiari erroneamente 3360 domande taggate con “sql-server” ora, ea causa di un rollback della transazione, 3359 domande un secondo dopo.

Come sviluppatore professionista direi che dipende. Ma sicuramente seguo i consigli GATS e OMG Ponies. Sapere cosa stai facendo, sapere quando aiuta e quando fa male e

leggi suggerimenti e altre idee sbagliate

cosa potrebbe farti capire meglio il server SQL. Di solito seguo la regola che gli Hint SQL sono EVIL, ma sfortunatamente li uso ogni tanto quando sono stufo di forzare il server SQL a fare cose … Ma questi sono casi rari.

luke

Quando il supporto dell’app voleva rispondere alle query ad hoc dal server di produzione utilizzando SSMS (che non erano supportati tramite report), ho chiesto che usassero nolock. In questo modo l’attività “principale” non è influenzata.

Sono d’accordo con alcuni commenti sul suggerimento NOLOCK e specialmente con quelli che dicono “usalo quando è appropriato”. Se l’applicazione è scritta male e sta usando la concorrenza in modo inappropriato – ciò potrebbe causare l’escalation del blocco. Anche la tabella altamente transazionale si blocca sempre a causa della loro natura. Avere una buona copertura dell’indice non aiuta a recuperare i dati, ma l’impostazione LIVELLO DI ISOLAMENTO per LEGGERE UNCOMMITTED lo fa. Inoltre, credo che l’uso di NOLOCK hint sia sicuro in molti casi quando la natura dei cambiamenti è prevedibile. Per esempio – nella produzione quando i lavori con i viaggiatori attraversano diversi processi con molti inserimenti di misure, puoi tranquillamente eseguire query sul lavoro finito con l’hint NOLOCK e in questo modo evitare la collisione con altre sessioni che mettono i blocchi PROMOTATI o ESCLUSIVI sul tavolo /pagina. I dati a cui si accede in questo caso sono statici, ma possono risiedere in una tabella molto transazionale con centinaia di milioni di record e migliaia di aggiornamenti / inserti al minuto. Saluti

Credo che non sia praticamente mai corretto usare nolock.

Se stai leggendo una singola riga, l’indice corretto significa che non avrai bisogno di NOLOCK mentre le azioni di riga individuali vengono completate rapidamente.

Se stai leggendo molte righe per qualcosa di diverso dal display temporaneo, e ti preoccupi di poter ripetere il risultato, o difendere dal numero prodotto, allora NOLOCK non è appropriato.

NOLOCK è un tag surrogato per “non mi interessa se questa risposta contiene righe duplicate, righe che vengono cancellate o righe che non sono mai state inserite per iniziare a causa del rollback”

Errori possibili in NOLOCK:

  • Le file che corrispondono non vengono restituite affatto.
  • le singole righe vengono restituite più volte (incluse più istanze della stessa chiave primaria)
  • Le righe che non corrispondono vengono restituite.

Qualsiasi azione che può causare la divisione di una pagina mentre la selezione noLock è in esecuzione può causare il verificarsi di tali eventi. Quasi ogni azione (anche una cancellazione) può causare una divisione della pagina.

Pertanto: se “sai” che la riga non verrà modificata mentre stai correndo, non utilizzare nolock, poiché un indice consentirà un recupero efficiente.

Se si sospetta che la riga possa cambiare mentre la query è in esecuzione, e se si preoccupa dell’accuratezza, non utilizzare nolock.

Se si considera NOLOCK a causa di deadlock, esaminare la struttura del piano di query per scansioni di tabelle inattese, tracciare i deadlock e vedere perché si verificano. NOLOCK intorno alle scritture può significare che le query precedentemente bloccate potrebbero potenzialmente scrivere una risposta sbagliata.

Le soluzioni migliori, quando ansible sono:

  • Replica i tuoi dati (utilizzando la replica del registro) in un database di report.
  • Utilizzare gli snapshot SAN e montare una versione coerente del DB
  • Utilizzare un database con un livello di isolamento delle transazioni fondamentale migliore

Il livello di isolamento della transazione SNAPSHOT è stato creato perché MS stava perdendo vendite a Oracle. Oracle utilizza i registri di annullamento / ripristino per evitare questo problema. Postgres utilizza MVCC. In futuro Heckaton utilizzerà MVCC, ma mancano anni alla produzione.

NOLOCK è spesso sfruttato come un modo magico per velocizzare le letture del database, ma cerco di evitare di usarlo nel modo più assoluto ansible.

Il set di risultati può contenere righe che non sono ancora state confermate, che spesso vengono ripristinate in seguito.

Un errore o un set di risultati può essere vuoto, mancare righe o visualizzare più volte la stessa riga.

Questo perché altre transazioni stanno spostando dati nello stesso momento in cui lo stai leggendo.

READ COMMITTED aggiunge un ulteriore problema in cui i dati sono danneggiati all’interno di una singola colonna in cui più utenti cambiano la stessa cella contemporaneamente.

Nella vita reale dove incontri sistemi già scritti e aggiungi indici alle tabelle, quindi rallenta drasticamente il caricamento dei dati di una tabella di dati da 14gig, sei costretto a usare WITH NOLOCK nei tuoi report e alla fine del mese in modo che le funzioni di aggregazione (sum , contare, ecc.) non eseguire il blocco di righe, pagine, tabelle e deterrare le prestazioni complessive. Facile da dire in un nuovo sistema, non utilizzare mai NOLOCK e utilizzare gli indici, ma aggiungere indici rallenta drasticamente il caricamento dei dati, e quando mi viene detto, beh, modificare il codice base per eliminare gli indici, quindi caricare di massa quindi ricreare gli indici va tutto bene, se stai sviluppando un nuovo sistema. Ma non quando hai già un sistema in atto.