Questo livello di isolamento consente letture sporche. Una transazione potrebbe visualizzare modifiche non vincolate apportate da un'altra transazione.
Per mantenere il massimo livello di isolamento, un DBMS in genere acquisisce blocchi sui dati, il che può comportare una perdita di concorrenza e un sovraccarico di blocco elevato. Questo livello di isolamento rilassa questa proprietà.
Potresti voler controllare l'articolo di Wikipedia su READ UNCOMMITTED
per alcuni esempi e ulteriori letture.
Potresti anche essere interessato a dare un'occhiata all'articolo del blog di Jeff Atwood su come lui e il suo team hanno affrontato un problema di stallo nei primi giorni di Stack Overflow. Secondo Jeff:
Ma è nolock
pericoloso? Potresti finire per leggere dati non validi con read uncommitted
su? Sì, in teoria. Non ti mancheranno gli astronauti dell'architettura del database che iniziano a scaricarti la scienza ACID e fanno scattare l'allarme antincendio dell'edificio quando dici loro che vuoi provare nolock
.È vero:la teoria fa paura. Ma ecco cosa penso:"In teoria non c'è differenza tra teoria e pratica. In pratica c'è."
Non consiglierei mai di usare nolock
come una soluzione generale "buona per ciò che ti affligge" per qualsiasi problema di blocco del database che potresti avere. Dovresti prima provare a diagnosticare l'origine del problema.
Ma in pratica aggiungendo nolock
alle domande che sai assolutamente essere semplici, diritte questioni di sola lettura non sembrano mai portare a problemi... Finché sai cosa stai facendo.
Un'alternativa al READ UNCOMMITTED
il livello che potresti voler considerare è il READ COMMITTED SNAPSHOT
. Citando ancora Jeff:
Le istantanee si basano su un metodo di rilevamento delle modifiche dei dati completamente nuovo... più che una semplice modifica logica, richiede che il server gestisca i dati fisicamente in modo diverso. Una volta abilitato, questo nuovo metodo di rilevamento delle modifiche ai dati crea una copia o un'istantanea di ogni modifica dei dati. Leggendo queste istantanee anziché i dati in tempo reale nei momenti di conflitto, i blocchi condivisi non sono più necessari durante le letture e le prestazioni complessive del database potrebbero aumentare.