Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Modifiche al livello di isolamento predefinito di SQL Server

Nel tuo scenario, consiglierei di impostare esplicitamente il livello di isolamento su snapshot, che impedirà alla lettura di interferire con le scritture (inserti e aggiornamenti) impedendo i blocchi, ma quelle lette sarebbero comunque letture "buone" (cioè dati non sporchi - non è la stessa cosa di un NOLOCK)

Generalmente trovo che dove ho problemi di blocco con le mie query, controllo manualmente il blocco applicato. per esempio. farei aggiornamenti con blocchi a livello di riga per evitare il blocco a livello di pagina/tabella e impostare le mie letture su readpast (accettando che potrei perdere alcuni dati, in alcuni scenari potrebbero essere ok)link|edit|delete|flag

EDIT-- Combinando tutti i commenti nella risposta

Come parte del processo di ottimizzazione, il server sql evita di eseguire letture impegnate su una pagina che sa non è stata modificata e torna automaticamente a una strategia di blocco inferiore. Nel tuo caso, il server sql passa da una lettura serializzabile a una lettura ripetibile.

D:Grazie per le informazioni utili sull'abbassamento dei livelli di isolamento. Riuscite a pensare a qualche motivo per cui avrebbe utilizzato Serializable IsolationLevel in primo luogo, dato che non utilizziamo una transazione esplicita per SELECT:era nostra comprensione che la transazione implicita avrebbe utilizzato ReadCommitted?

A:Per impostazione predefinita, SQL Server utilizzerà Read Commmited se questo è il tuo livello di isolamento predefinito MA se non specifichi inoltre una strategia di blocco nella tua query, in pratica stai dicendo a sql server "fai ciò che ritieni sia meglio, ma la mia preferenza viene letto impegnato". Poiché SQL Server è libero di scegliere, lo fa per ottimizzare la query. (L'algoritmo di ottimizzazione nel server sql è molto complesso e non lo capisco completamente da solo). La mancata esecuzione in modo esplicito all'interno di una transazione non influisce, afaik, sul livello di isolamento utilizzato da sql server.

D:Un'ultima cosa, sembra ragionevole che SQL Server aumenti il ​​livello di isolamento (e presumibilmente il numero di blocchi richiesti) per ottimizzare la query? Mi chiedo anche se il riutilizzo di una connessione in pool potrebbe influire su questo se ereditasse l'ultimo livello di isolamento utilizzato?

A:Il server SQL lo farà come parte di un processo chiamato "Lock Escalation". Da http://support.microsoft.com/kb/323630 , cito:"Microsoft SQL Server determina dinamicamente quando eseguire l'escalation dei blocchi. Quando si prende questa decisione, SQL Server prende in considerazione il numero di blocchi che vengono mantenuti in una particolare scansione, il numero di blocchi che vengono mantenuti dall'intera transazione, e la memoria utilizzata per i blocchi nel sistema nel suo insieme.In genere, il comportamento predefinito di SQL Server determina un'escalation dei blocchi che si verifica solo nei punti in cui migliorerebbe le prestazioni o quando è necessario ridurre la memoria di blocco eccessiva del sistema a un livello più ragionevole . Tuttavia, alcune progettazioni di applicazioni o query possono attivare l'escalation del blocco in un momento in cui non è auspicabile e il blocco della tabella escalation può bloccare altri utenti".

Sebbene l'escalation dei blocchi non sia esattamente la stessa cosa della modifica del livello di isolamento in cui viene eseguita una query, questo mi sorprende perché non mi sarei aspettato che il server sql richiedesse più blocchi di quelli consentiti dal livello di isolamento predefinito.