Domanda

Un DBA che la mia azienda ha assunto per risolvere i problemi di deadlock mi ha appena detto che i nostri problemi di blocco dei database OLTP miglioreranno se impostiamo il livello di transazione su LEGGI IMPEGNATO da LEGGERE NON COMUNITATO.

Non è falso solo al 100%? LEGGI IMPEGNATO causerà più blocchi, giusto?


Ulteriori dettagli:

I nostri dati sono molto " siled " e specifico dell'utente. Il 99,9999999% di tutte le interazioni dell'utente funziona con i tuoi dati e i nostri scenari di lettura sporca, se si verificano, possono a malapena influenzare ciò che l'utente sta cercando di fare.


Grazie per tutte le risposte, il dba in questione è risultato inutile e abbiamo risolto i problemi di blocco aggiungendo un singolo indice.


Mi dispiace di non aver specificato che si stavano verificando problemi di blocco per le istruzioni di aggiornamento e non per selezioni regolari. Dal mio googing i due diversi tipi di query hanno soluzioni distinte quando si affrontano i problemi di blocco.

È stato utile?

Soluzione

Sembra una decisione un po 'avventata, ma senza tutti i dettagli del tuo ambiente è difficile dirlo.

Dovresti consigliare al tuo DBA di considerare l'uso delle funzionalità di isolamento avanzate di SQL Server, ovvero l'uso delle tecniche di Versioning delle file. Questo è stato introdotto in SQL Server 2005 per risolvere in modo specifico i problemi con il database OLTP che presentano un blocco elevato.

Il seguente white paper contiene argomenti piuttosto complicati ma è un must per tutti i DBA eccezionali. Include esempi su come utilizzare ciascuno dei livelli di isolamento aggiuntivi, in diversi tipi di ambienti, ad esempio OLTP, Offloaded Reporting Environment ecc.

http://msdn.microsoft.com/en-us/library/ ms345124.aspx

In breve, sarebbe sia folle che avventato modificare l'isolamento delle transazioni per tutte le vostre query T-SQL senza prima sviluppare una solida comprensione di come si sta verificando un blocco eccessivo all'interno del vostro ambiente.

Spero che questo aiuti, ma per favore fatemi sapere se avete bisogno di ulteriori chiarimenti.

Cheers!

Altri suggerimenti

Non dipende da quale sia il tuo problema: ad esempio se il tuo problema è un deadlock, un aumento del livello di blocco potrebbe non causare una precedente acquisizione di blocchi e quindi una ridotta possibilità di abbraccio mortale?

Se i dati sono stati messi a tacere e si stanno ancora ottenendo deadlock, potrebbe essere semplicemente necessario aggiungere suggerimenti per il rowlock alle query che causano il problema in modo che i blocchi vengano acquisiti a livello di riga e non a livello di pagina (che è il di default).

READ UNCOMMITTED ridurrà il numero di blocchi se si stanno bloccando i dati a causa delle istruzioni SELECT. Se stai bloccando i dati a causa delle istruzioni INSERT, UPDATE e DELETE, la modifica del livello di isolamento in READ UNCOMMITTED non farà nulla per te. READ UNCOMMITTED ha lo stesso effetto dell'aggiunta di WITH (NOLOCK) alle tue query.

Sembra spaventoso. Vuoi davvero solo cambiare questi parametri per evitare deadlock? Forse i dati devono essere bloccati?

Detto questo, è possibile che il DBA si riferisca al nuovo (a partire da SQL Server 2005) LEGGI L'IMMAGINE COMMITTENTE che utilizza il controllo delle versioni delle righe e può eliminare alcuni tipi di deadlock.

http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005-Snapshots.htm

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top