2010-08-23 12 views
107

qualcuno potrebbe darmi qualche indicazione su quando dovrei usare WITH (NOLOCK) al contrario di SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDCON (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Quali sono i vantaggi/svantaggi di ciascuno? Ci sono delle conseguenze indesiderate che hai incontrato usando l'uno rispetto all'altro?

risposta

91

Essi sono la stessa cosa. Se si utilizza l'istruzione set transaction isolation level, verrà applicata a tutte le tabelle della connessione, quindi se si desidera utilizzare solo uno o due tabelle, utilizzare lo standard nolock; altrimenti usa l'altro.

Entrambi vi daranno letture sporche. Se stai bene con quello, allora usali. Se non è possibile avere letture sporche, prendere in considerazione i suggerimenti snapshot o serializable.

+0

Considerare 'REPEATABLE READ' invece di 'SERIALIZABLE' se non si preoccupano dei dati fantasma. 'SERIALIZABLE' è VERAMENTE restrittivo e non dovrebbe quasi mai essere usato (ad eccezione, ad esempio, di alcune applicazioni finanziarie critiche). – Kryptos

8

A mia conoscenza, l'unica differenza è la portata degli effetti, come ha detto Strommy. NOLOCK suggerisce su un tavolo e LEGGERE UNCOMMITTED sulla sessione.

Per quanto riguarda i problemi che possono verificarsi, è tutto sulla coerenza. Se ti interessa, tieni presente che potresti ottenere ciò che viene chiamato "dirty read" che potrebbe influenzare altri dati manipolati su informazioni errate.

Personalmente non penso di aver visto alcun problema da questo, ma ciò potrebbe essere dovuto al modo in cui uso nolock. È necessario essere consapevoli del fatto che ci sono scenari in cui sarà OK da usare. Scenari in cui si aggiungono per lo più nuovi dati a una tabella ma si ha un altro processo che viene fornito in retroverno per verificare uno scenario di dati. Questo probabilmente andrà bene poiché il flusso principale non include tornare indietro e aggiornare le righe durante una lettura.

Inoltre, credo che in questi giorni si dovrebbe esaminare in Concurrency Control Multi-versione. Credo che l'abbiano aggiunto nel 2005 e aiuta a impedire agli scrittori di bloccare i lettori dando ai lettori un'istantanea del database da utilizzare. Io includo un link e lascio ulteriori ricerche per il lettore:

MVCC

Database Isolation Levels

+0

+1 Anche se non sono entrato nell'aspetto "should you" di READ_UNCOMMITTED ", Sean lo tratta bene. Ci sono anche casi in cui è possibile leggere la stessa riga due volte in SQL Server (a causa di divisioni di pagina). – Anon246

9
  • NOLOCK è locale al tavolo (o viste, ecc)
  • LEGGI UNCOMMITTED è per sessione/collegamento

Come per le linee guida ... una ricerca casuale da StackOverflow e l'interweb elettrico ...

+0

L'ultimo link "Perché usare NOLOCK è male .." non esiste più. – sangam

+0

interweb elettrico non ha prezzo, grazie per aver aggiunto un po 'di sole alla mia giornata. – JJS

3

Come si deve usare CON (NOLOCK) per ogni tabella potrebbe essere fastidioso per scriverlo in ogni FROM o JOIN clausola. Tuttavia ha una ragione per cui è chiamata una lettura "sporca". Quindi dovresti sapere quando lo fai e non impostarlo come predefinito per l'ambito della sessione. Perché?

Dimenticare una CON (NOLOCK) potrebbe non interessare il vostro programma in un modo molto drammatico, ma facendo una lettura sporca dove si fa non vuole si può fare la differenza in determinate circostanze.

Quindi utilizzare WITH (NOLOCK) se è possibile che i dati correnti selezionati non siano corretti, poiché potrebbe essere ripristinato in un secondo momento. Questo è principalmente usato quando si desidera aumentare le prestazioni e i requisiti sul contesto dell'applicazione consentono di correre il rischio che vengano visualizzati dati incoerenti. Comunque tu o qualcuno in carica devi valutare i pro e i contro della decisione di usare WITH (NOLOCK).

4

Non è possibile utilizzare Imposta livello di isolamento delle transazioni Lettura non ammessa in una vista (in effetti è possibile avere solo uno script), quindi è necessario utilizzare (Null) se devono essere incluse righe sporche.

Problemi correlati