Symptom
Tänk dig följande situation:
-
Du har en databas som innehåller alternativen ALLOW_SNAPSHOT_ISOLATION och READ_COMMITTED_SNAPSHOT aktive rad i Microsoft SQL Server 2008 R2.
-
Du kör ett Select -uttryck som innehåller TABLOCK -och UPDLOCK -tips mot en tabell i databasen.
-
Select -uttrycket är inkapslat i en explicit påbörjaomlastning men commit omlastning utförs inte.
-
Två av de frågor som startas med samma frågeuttryck är i den explicita transaktionen.
I det här scenariot kommer en av de andra frågorna att vara död när den första frågan är bekräftad.
Orsak
Problemet uppstår eftersom SQL Server rapportera död läge i något av följande fall:
-
När ALLOW_SNAPSHOT_ISOLATION och READ_COMMITTED_SNAPSHOT är aktiverade för en databas kan flera frågor mot samma transaktion rapporteras som död när en av dem är klar.
-
När ALLOW_SNAPSHOT_ISOTION är aktiverat och tipsen TABLOCK och UPDLOCK används, tar det andra och tredje Select -uttrycket IX lås med avsikt att konvertera till X. I 9 låses död lägen när ett försök görs att konvertera till X.
-
När ALLOW_SNAPSHOT_ISOLATION är inaktiverat får de andra och tredje frågorna ett sex lås. Om det sex låset konverteras till X är det bara ett block scenario, inte ett död läge.
Lösning
Problemet är först åtgärdat i den kumulativa uppdateringen av SQL Server. När du har installerat snabb korrigeringen löser du problemet genom att logga in om ett Läs -eller NOLOCK -tips påträffas för databasen och frågan. Den här informationen används för att välja rätt typ av lås för att hantera situationen korrekt, i stället för att rapportera deadlock felaktigt.
Kumulativ uppdatering 11 för SQL Server 2008 R2 SP2 /en-us/help/2926028
Varje ny kumulativ uppdatering för SQL Server innehåller alla snabb korrigeringar och alla säkerhets korrigeringar som ingick i den föregående kumulativa uppdateringen. Kolla in de senaste kumulativa uppdateringarna för SQL Server:
Status
Microsoft har bekräftat att det här är ett problem i Microsoft-produkterna som nämns i "gäller".