FIX: Query con livello di isolamento della transazione impostato su READ UNCOMMITTED ha esito negativo con errore 601

BUG #: 363988 (SHILOH_BUGS)

Sintomi

Quando si esegue una query con il suo livello di isolamento della transazione impostato su READ UNCOMMITTED, SQL Server 2000 interrompe la query e restituisce il seguente messaggio di errore:

Server: Msg 601, livello 12, stato 3, riga 14
Impossibile continuare la scansione tramite NOLOCK a causa dello spostamento di dati.

Causa

Questo comportamento può verificarsi quando tra il tempo di SQL Server legge la posizione della riga da un indice e l'ora di SQL Server recupera la riga viene eliminata una riga in una tabella.

Risoluzione

Informazioni sul Service pack

Per risolvere questo problema, procurarsi il service pack più recente per Microsoft SQL Server 2000. Per ulteriori informazioni, fare clic sul numero riportato di seguito per visualizzare l'articolo della Microsoft Knowledge Base riportato di seguito:
290211 come ottenere il service pack più recente di SQL Server 2000

Informazioni sull'hotfix

La versione inglese di questo hotfix presenta gli attributi di file (o attributi successivi) elencati nella tabella riportata di seguito. Le date e ore dei file sono elencate in ora UTC (coordinated universal time). Quando si visualizzano le informazioni sul file, viene convertito in ora locale. Per calcolare la differenza tra ora UTC e ora locale, utilizzare la scheda fuso orario nello strumento Data e ora nel Pannello di controllo.
DateTimeVersionSize File name
-----------------------------------------------------------------------------

07-Feb-200316:14 786,432 bytes Distmdl.ldf
07-Feb-200316:142,359,296 bytes Distmdl.mdf
29-Jan-200312:25 180 bytes Drop_repl_hotfix.sql
31-Jan-200311:022000.80.763.01,557,052 bytes Dtsui.dll
29-Jan-200315:48 746,470 bytes Instdist.sql
29-Jan-200312:25 1,402 bytes Inst_repl_hotfix.sql
07-Feb-200317:102000.80.765.0 90,692 bytes Msgprox.dll
29-Jan-200311:487.0.9466.0 344,064 bytes Msvcr70.dll
29-Jan-200311:482000.80.722.0 57,904 bytes Osql.exe
07-Feb-200314:23 1,065,895 bytes Replmerg.sql
07-Feb-200317:102000.80.765.0 221,768 bytes Replprov.dll
07-Feb-200317:102000.80.765.0 307,784 bytes Replrec.dll
29-Jan-200315:48 1,084,318 bytes Replsys.sql
29-Jan-200311:482000.80.534.0 127,548 bytes Sqdedev.dll
07-Feb-200317:102000.80.765.0 176,696 bytes Sqlmap70.dll
07-Feb-200317:102000.80.765.0 57,920 bytes Sqlrepss.dll
14-Feb-200313:222000.80.769.0 7,512,145 bytes Sqlservr.exe
29-Jan-200311:482000.80.194.0 180,290 bytes Sqlunirl.dll
07-Feb-200317:102000.80.765.0 45,644 bytes Sqlvdi.dll
07-Feb-200317:102000.80.765.0 82,492 bytes Ssnetlib.dll

Nota: A causa delle dipendenze tra file, la correzione o funzionalità che contiene i file più recente può contenere anche file aggiuntivi.

Stato

Microsoft ha confermato che si tratta di un problema nei prodotti Microsoft elencati nella sezione "Si applica a". Il problema è stato risolto in Microsoft SQL Server 2000 Service Pack 4.

Ulteriori informazioni

Dopo aver installato l'hotfix, è possibile utilizzare il flag di traccia 9134 per modificare il comportamento di SQL Server. Per attivare il flag di traccia 9134 in modo che sia acceso quando SQL Server viene avviato, aggiungere il flag di traccia come parametro di avvio di SQL Server. Per aggiungere il flag di traccia 9134 come parametro di avvio di SQL Server, attenersi alla seguente procedura:
  1. In SQL Server Enterprise Manager, mouse del server che esegue SQL Server e quindi fare clic su
    Le proprietà.
  2. Nella scheda Generale , fare clic su Parametri di avvio.
  3. Nella casella di testo del parametro , digitare
    -T9134, fare clic su Aggiungie quindi fare clic su
    OK.
  4. Nella finestra di dialogo SQL Server Properties(Configure) - <Nome Server> , fare clic su OK.
  5. Riavviare il servizio SQL Server per il nuovo parametro abbiano effetto.
In alternativa, è possibile eseguire la seguente query in Query Analyzer per attivare in modo dinamico il flag di traccia:
DBCC TRACEON (9134, -1)
Tuttavia, se si aggiunge il flag di traccia 9134 come parametro di avvio, l'effetto del comando DBCC TRACEON viene perduto quando si riavvia il servizio SQL Server.

Quando viene attivato il flag di traccia 9134 e una riga viene eliminata o modificata tra il tempo di SQL Server legge la posizione della riga e il momento in cui che recupera la riga tramite la ricerca di un segnalibro, la query non interrompere o restituire errori 601. Invece di SQL Server ignora la riga che non è possibile individuare e continua a cercare altre righe che soddisfano i criteri di query. Pertanto, continua l'esecuzione della query; Tuttavia, SQL Server restituisce i risultati potrebbero non includere le righe che sono state eliminate o spostate durante l'esecuzione della query.

Nota: Le informazioni contenute in questo articolo e la traccia flag si applicano solo a una query che viene eseguita con il livello di isolamento della transazione è impostato su READ UNCOMMITTED. Le informazioni non si applicano a una query che viene eseguita con l'hint di ottimizzazione NOLOCK. In tal caso, il comportamento rimane invariato rispetto a quanto descritto nella sezione "Sintomi".

Inoltre, il flag di traccia non influenza il fatto che altre incoerenze di errori e dati possono verificarsi quando la lettura dei dati non salvati. Per ulteriori informazioni sui livelli di isolamento supportati da SQL Server e l'effetto dell'utilizzo di ogni livello di isolamento, vedere l'argomento "Locking" nella documentazione in linea di SQL Server.

Microsoft non consiglia l'utilizzo di questo flag di traccia a meno che non si applicano le condizioni seguenti:
  • L'applicazione in uso richiede un livello di isolamento READ UNCOMMITTED.
  • L'applicazione in uso si sta verificando un numero elevato di 601 errori.
  • Comprendere che, quando si utilizza il flag di traccia, vengono ignorate le righe che sono state eliminate o spostate durante l'esecuzione della query.
Nota: Prima di utilizzare il livello di isolamento READ UNCOMMITTED, è necessario conoscere la sua funzionalità. Per ulteriori informazioni sul livello di isolamento READ UNCOMMITTED, visitare il seguente sito Web Microsoft Developer Network (MSDN):

Riferimenti

Per ulteriori informazioni, fare clic sul numero riportato di seguito per visualizzare l'articolo della Microsoft Knowledge Base riportato di seguito:
235880 INF: ottimizzatore Hint NOLOCK o isolamento livello READ UNCOMMITTED genera l'errore 605
Per ulteriori informazioni, visitare i seguenti siti Web MSDN:
Proprietà

ID articolo: 815008 - Ultima revisione: 30 gen 2017 - Revisione: 1

Feedback