WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED


118

Qualcuno potrebbe darmi qualche guida su quando dovrei usare WITH (NOLOCK)al contrario diSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Quali sono i pro / contro di ciascuno? Ci sono conseguenze indesiderate che hai riscontrato utilizzando uno anziché l'altro?

Risposte:


105

Sono la stessa cosa. Se si utilizza l' set transaction isolation levelistruzione, verrà applicata a tutte le tabelle nella connessione, quindi se si desidera solo una nolocksu una o due tabelle, utilizzare quella; altrimenti usa l'altro.

Entrambi ti daranno letture sporche. Se ti va bene, usali. Se non puoi avere letture sporche, prendi in considerazione snapshoto serializablesuggerimenti.


Considera REPEATABLE READinvece di SERIALIZABLEse non ti interessano i dati fantasma. SERIALIZABLEè VERAMENTE restrittivo e non dovrebbe quasi mai essere utilizzato (tranne ad esempio in alcune applicazioni finanziarie critiche).
Kryptos


10
  • NOLOCK è locale per la tabella (o viste, ecc.)
  • READ UNCOMMITTED è per sessione / connessione

Per quanto riguarda le linee guida ... una ricerca casuale da StackOverflow e l'interweb elettrico ...


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

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

9

Per quanto ne so, l'unica differenza è la portata degli effetti, come ha detto Strommy. Suggerimento NOLOCK su un tavolo e READ UNCOMMITTED sulla sessione.

Per quanto riguarda i problemi che possono verificarsi, è tutta una questione di coerenza. Se ti interessa, tieni presente che potresti ottenere quelle che vengono chiamate letture sporche che potrebbero influenzare la manipolazione di altri dati su informazioni errate.

Personalmente non penso di aver riscontrato alcun problema da questo, ma potrebbe essere più dovuto a come uso nolock. È necessario essere consapevoli del fatto che ci sono scenari in cui sarà OK da usare. Scenari in cui si aggiungono principalmente nuovi dati a una tabella ma si ha un altro processo dietro per verificare uno scenario di dati. Probabilmente andrà bene poiché il flusso principale non include il ritorno e l'aggiornamento delle righe durante una lettura.

Inoltre credo che in questi giorni dovresti esaminare il controllo della concorrenza multi-versione. Credo che l'abbiano aggiunto nel 2005 e aiuta a impedire agli scrittori di bloccare i lettori fornendo ai lettori un'istantanea del database da utilizzare. Includerò un collegamento e lascerò ulteriori ricerche al lettore:

MVCC

Livelli di isolamento del database


+1 Anche se non sono entrato nell'aspetto "dovresti" di READ_UNCOMMITTED ", Sean lo copre bene. Ci sono anche casi in cui puoi leggere la stessa riga due volte in SQL Server (a causa delle divisioni di pagina).
Anon246

6

Non è possibile utilizzare Imposta livello di isolamento della transazione Lettura non confermata in una vista (in effetti è possibile avere solo uno script), quindi è necessario utilizzare (nolock) se devono essere incluse righe sporche.


4

Dato che devi usare WITH (NOLOCK) per ogni tabella, potrebbe essere fastidioso scriverlo in ogni clausola FROM o JOIN. Tuttavia ha un motivo per cui viene chiamata lettura "sporca". Quindi dovresti davvero sapere quando ne fai uno e non impostarlo come predefinito per l'ambito della sessione. Perché?

Dimenticare un WITH (NOLOCK) potrebbe non influenzare il tuo programma in modo molto drammatico, tuttavia eseguire una lettura sporca in cui non ne vuoi una può fare la differenza in determinate circostanze.

Quindi usa WITH (NOLOCK) se i dati correnti selezionati possono essere errati, poiché potrebbero essere ripristinati in seguito. Viene utilizzato principalmente quando si desidera aumentare le prestazioni ei requisiti del contesto dell'applicazione consentono di correre il rischio che vengano visualizzati dati incoerenti. Tuttavia, tu o un responsabile dovete valutare i pro ei contro della decisione di utilizzare WITH (NOLOCK).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.