Nivån av isolering av transaktioner i SQL Server och deras relation till smutsiga läsningar, icke-upprepningsbara läsningar, fantomläsningar osv. (kodargument och tidssekvenser)
Genom att förstå dessa problem som kan uppstå vid samtidiga åtkomst till databasen kan vi fortsätta att förstå begreppet databasisoleringsnivå, på lekmannaspråk: hur vill du isolera samtidiga transaktioner, och i vilken utsträckning? Till exempel, om smutsiga läsningar kan tolereras, eller om du inte vill att samtidiga transaktioner ska ha smutsiga läsningar, kan dessa ställas in på isoleringsnivå för att göra isoleringen mellan samtidiga transaktioner lös eller allvarlig.
Ju högre isoleringsnivå, desto mindre risk att läsa smutsiga eller ofullständiga data, men desto allvarligare är prestandaförsämringen i högsamtidighetssystem. Ju lägre isoleringsnivå, desto större prestandaförbättring i det samtidiga systemet, men själva datan kan vara ofullständig.
I SQL Server 2012 kan du ställa in isoleringsnivån för en transaktion (från låg till hög) med denna syntax:
SÄTT TRANSAKTIONSISOLERINGSNIVÅ { LÄS OENGAGERAT | LÄS ENGAGERAD | UPPREPBAR LÄSNING | ÖGONBLICKSBILD | SERIEFIENDÖS } [ ; ] Först skapar du ett nytt testskript, skapar en databas och infogar testdata, enligt följande:
Skapa ett nytt fönster A, öppna en transaktion, utföra uppdateringsoperationen och vänta 10 sekunder innan du committar, koden är följande:
Skapa ett nytt fönster B, sätt transaktionen READ UNCOMMITTED (ocommitted read, lägsta nivå, det enkla problemet är dirty reading, eftersom den kan läsa data som ändrats av andra transaktioner men inte committed.) Den gör samma sak som att sätta (NOLOCK) på SELECT-satsens objekttabell i en transaktion. Fråga datan, koden är följande:
Skapa ett nytt fönster C, direkt genom datan, enligt följande:
I sin tur,Kör fönster A, B och C och upptäck att när data uppdateras kan fönster B omedelbart returnera data (Det är möjligt att avläsningen är smutsig data), C-fönstret måste vänta på att A-fönstret ska bli klart med exekveringenkommer att returnera datan, som visas i figuren nedan:
(Fönster B)
(Fönster C)
(Slut)
|