Sümptomid
Arvestage järgmise stsenaariumiga.
-
Teil on andmebaas, millel on suvandid ALLOW_SNAPSHOT_ISOLATION ja READ_COMMITTED_SNAPSHOT lubatud Microsoft SQL Server 2008 R2.
-
Käivitate Select -lause, mis sisaldab TABLOCK ja UPDLOCK vihjeid andmebaasi tabeli vastu.
-
Select -lause on pakendatud otse algusse TRAN, kuid commit ei käivitata.
-
Kaks sama päringut, mis on käivitatud sama päringu vihjetega, on otseses tehingus.
Selle stsenaariumi korral, kui esimene päring on toime pandud, on mõni muu päring tupik.
Põhjus
See probleem ilmneb, sest SQL serveri valesti teatab tupik ühes järgmistest olukordadest.
-
Kui ALLOW_SNAPSHOT_ISOLATION ja READ_COMMITTED_SNAPSHOT on andmebaasi jaoks lubatud, võidakse mitu päringut sama tehingu vastu esitada, kui üks neist on lõpule jõudnud.
-
Kui ALLOW_SNAPSHOT_ISOTION on lubatud ja vihjed TABLOCK ja UPDLOCK kasutatakse, siis teine ja kolmas Select -lause võtavad IX lukud, et teisendada see väärtuseks X. IX lukud lõpevad deadlocking, kui proovitakse teisendada X-i.
-
Kui ALLOW_SNAPSHOT_ISOLATION on keelatud, saavad teisel ja kolmandal päringul kuus lukku. Sellisel juhul, kui kuus lukk teisendatakse X-iks, on see lihtsalt blokeerimise stsenaarium, mitte tupik.
Lahendus
Probleem parandati esmakordselt SQL serveri järgmises koondvärskenduses. Pärast käigultparanduse rakendamist lahendab SQL-Server probleemi salvestamisega, kui andmebaasi ja päringu kohta ilmneb loetud vihje või NOLOCK vihje. Seda teavet kasutatakse õigete lukkude valimiseks, et olukorda õigesti käsitseda, mitte valesti aru tupik.
Kumulatiivne värskendus 11 SQL Server 2008 R2 hoolduspaketi SP2 jaoks /en-us/help/2926028
Iga uus koondvärskenduses SQL Server sisaldab kõiki käigultparandused ja kõik turvaparandusi, mis kuulusid eelmise koondvärskenduse. Vaadake SQL serveri kumulatiivseid värskendusi.
Olek
Microsoft on kinnitanud, et see probleem esineb jaotises "kehtib järgmiste toodete kohta" loetletud Microsofti toodetes.