Occasionalmente ricevo "Impossibile continuare la scansione a NOLOCK
causa dello spostamento dei dati" con alcuni lavori di grandi dimensioni, che hanno WITH (NOLOCK)
sulle query selezionate.
Capisco che ciò abbia a che fare con il tentativo di selezionare i dati quando c'è stata una divisione della pagina che ha causato i dati non essere più dove avrebbero dovuto essere - presumo che sia ciò che sta accadendo nel mio ambiente.
Come lo riproduco?
Sto cercando di eseguire una soluzione temporanea per rilevare l'errore e riprovare quando ciò accade, ma non riesco a testarlo se non riesco a riprodurlo. C'è un modo ragionevolmente affidabile per causare questo?
Quando ciò accade, eseguire nuovamente la query ha esito positivo, quindi non ho alcuna preoccupazione sul fatto che i dati effettivi o il database siano permanentemente danneggiati. Alcune delle tabelle nella query (insieme ai loro indici) vengono eliminate, ricreate e ripopolate spesso, quindi presumo sia qualcosa correlato a questo.
La rimozione NOLOCK
è il mio problema a lungo termine da affrontare. Il motivo è NOLOCK
stato messo lì in primo luogo è che le query sono così brutte che si sono bloccati con le transazioni quotidiane, quindi è NOLOCK
stato un aiuto di fascia per fermare i deadlock (che ha funzionato). Quindi ho bisogno di un cerotto su un cerotto finché non possiamo fare una soluzione permanente.
Se potessi riprodurlo con un Hello World, probabilmente pianificherei di schiacciare il cerotto nel lavoro in meno di un'ora. Non riesco a eseguire la rimozione di ricerca e sostituzione NOLOCK
, perché ricomincerei a ottenere nuovamente i deadlock delle app, che sono peggio per me di un lavoro occasionale non riuscito.
L'uso dell'isolamento dell'istantanea con commit della lettura è una buona possibilità: dovrò lavorare con il nostro team di database per ottenere maggiori dettagli a riguardo. Parte del nostro problema è che non abbiamo un esperto di SQL Server che si occupi di quel tipo di cose, e non capisco i livelli di isolamento abbastanza bene da apportare quel cambiamento in questo momento.
DEADLOCK_PRIORITY
su LOW
nei lavori, in modo che se ci sono deadlock, i lavori falliranno e non le applicazioni. Successivamente, è possibile ricercare i deadlock e scoprire perché stanno accadendo e risolvere il problema. Potrebbe essere una soluzione molto semplice, come scambiare l'ordine di due istruzioni. Qualunque sia il problema, nonNOLOCK
è la soluzione , quindi smetti di provare a forzarlo perché è il più semplice.
NOLOCK
da questi lavori? 601 dovrebbe essere l'ultima delle tue preoccupazioni se i risultati di queste domande dovrebbero essere accurati . Paul White mostra un esempio particolarmente terribile di lettura dei dati che non dovrebbe essere possibile qui .