Sintomi
Considerare lo scenario descritto di seguito:
-
Si dispone di un database in cui sono disponibili le opzioni ALLOW_SNAPSHOT_ISOLATION e READ_COMMITTED_SNAPSHOT abilitate in Microsoft SQL Server 2008 R2.
-
Si esegue un'istruzione Select che contiene hint TABLOCK e UPDLOCK in una tabella nel database.
-
L'istruzione Select viene avvolta in un oggetto Begin Tranesplicito, ma il commit tran non viene eseguito.
-
Altre due delle stesse query avviate con gli stessi hint di query si trovano nella transazione esplicita.
In questo scenario, quando viene eseguito il commit della prima query, una delle altre query sarà deadlock.
Causa
Il problema si verifica perché SQL Server segnala in modo errato il deadlock in uno degli scenari seguenti:
-
Quando ALLOW_SNAPSHOT_ISOLATION e READ_COMMITTED_SNAPSHOT sono abilitati per un database, è possibile che più query sulla stessa transazione vengano segnalate in modo non corretto come deadlock quando una di queste viene completata.
-
Quando ALLOW_SNAPSHOT_ISOTION è abilitato e vengono usati i suggerimenti TABLOCK e UPDLOCK , la seconda e la terza istruzione Select accettano blocchi IX con l'intenzione di convertirla in X. I blocchi IX terminano in deadlock quando viene eseguito un tentativo di conversione in X.
-
Quando ALLOW_SNAPSHOT_ISOLATION è disabilitata, la seconda e la terza query otterranno un blocco di sei. In questa situazione, quando il blocco SIX viene convertito in X, è solo uno scenario di blocco, non un deadlock.
Risoluzione
Il problema è stato risolto per la prima volta nel seguente aggiornamento cumulativo di SQL Server. Dopo aver applicato l'hotfix, SQL Server risolve il problema registrando se per il database e la query viene rilevato un suggerimento per il commit o NOLOCK . Queste informazioni vengono usate per selezionare il tipo di blocco corretto per gestire correttamente la situazione, invece di segnalare in modo errato il deadlock.
Aggiornamento cumulativo 11 per SQL Server 2008 R2 SP2 /en-us/help/2926028
Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutti gli hotfix e tutti gli aggiornamenti della sicurezza inclusi nell'aggiornamento cumulativo precedente. Vedere gli ultimi aggiornamenti cumulativi per SQL Server:
Stato
Microsoft ha confermato che questo problema si verifica nei prodotti elencati nella sezione "Si applica a".