2009-06-19 18 views
17

Qual è la differenza tra l'utilizzo di "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" e NOLOCK? Uno è migliore dell'altro?NOLOCK rispetto al livello di isolamento della transazione

+2

Si noti che l'hint 'NOLOCK' è deprecato in MSSQL 2012, da sostituire con l'equivalente 'READUNCOMMITTED' suggerimento . [Fonte] (http://msdn.microsoft.com/en-us/library/ms187373.aspx). – Jeroen

+0

L'origine suggerita dice: 'Il supporto per l'uso dei suggerimenti READUNCOMMITTED e NOLOCK nella clausola FROM che si applicano alla tabella di destinazione di un'istruzione UPDATE o DELETE verrà rimosso in una versione futura di SQL Server. '. Non dice che 'NOLOCK' è deprecato. Attualmente sono disponibili sia i suggerimenti 'NOLOCK' e' READUNCOMMITTED' che credo. – RBT

risposta

20

Sono la stessa cosa, solo l'ambito in modo diverso. NOLOCK è posto su una base per tabella e SET Transaction... può essere inserito come blocco.

+0

grazie per la conferma! – Jason

+0

equivale a mettere il nolock in tutte le tabelle in sql in esecuzione? –

6

NOLOCK è un suggerimento di query e come tale si applica solo alla tabella specifc all'interno della query in cui è specificata.

L'impostazione del livello di isolamento della transazione si applica a tutto il codice eseguito quindi avanti all'interno della connessione corrente o finché non viene esplicitamente modificato.

Per chiarire, dal punto di vista funzionale il livello di isolamento sul lavoro è lo stesso, tuttavia l'ambito coperto potrebbe non esserlo.

4

Vedere that answer da qualche ora fa, alla domanda SQL Server SELECT statements causing blocking.

Citando Remus Rusanu:

SELECT può bloccare gli aggiornamenti. Un modello dati e una query correttamente progettati causeranno solo un blocco minimo e non costituiranno un problema. Il 'solito' con il suggerimento di NOLOCK è quasi sempre la risposta sbagliata. La risposta corretta è sintonizzare la query in modo che non esegua la scansione di tabelle enormi.

Se la query è impossibili da sintonizzare allora si dovrebbe prima prendere in considerazione il livello Isolamento dello snapshot, secondo si dovrebbe considerare l'utilizzo di snapshot di database e ultima opzione dovrebbe essere letture sporche (ed è meglio cambiare il livello di isolamento piuttosto che utilizzare l'hint NOLOCK). Nota che le letture sporche, come afferma chiaramente il nome, restituiranno dati incoerenti (ad esempio il tuo foglio totale potrebbe essere sbilanciato).

Le altre risposte possono essere d'aiuto.

+0

Solo la mia opinione ma il riferimento qui fornito non risponde alla domanda posta. –

+0

Non proprio, sì, ma ho pensato che potesse essere d'aiuto, dal momento che confronta NOLOCK con altri metodi di isolamento. –

1

Hanno lo stesso effetto, solo uno viene utilizzato come suggerimento di blocco (nolock) e l'altro è utilizzato per un ambito di connessione.

Fai attenzione a uno di questi: le letture sporche possono essere una cosa molto brutta a seconda della tua app. Leggere lo stesso record due volte o perdere un record a causa del movimento della pagina può essere una cosa molto confusa per gli utenti ...

Problemi correlati