Graden af isolation af transaktioner i SQL Server og deres forhold til beskidte læsninger, ikke-gentagelige læsninger, fantomlæsninger osv. (kodeargumenter og tidssekvenser)
Ved at forstå disse problemer, der kan opstå i tilfælde af samtidig adgang til databasen, kan vi fortsat forstå begrebet databaseisolationsniveau, på almindeligt dansk: hvordan vil du isolere samtidige transaktioner, og i hvilket omfang? For eksempel, hvis beskidte læsninger kan tolereres, eller hvis du ikke ønsker, at samtidige transaktioner skal have beskidte læsninger, kan disse sættes til isolationsniveauet for at gøre isolationen mellem samtidige transaktioner løs eller alvorlig.
Jo højere isolationsniveau, desto mindre risiko for at læse beskidte eller ufuldstændige data, men desto mere alvorlig er ydelsesforringelsen i systemer med høj samtidighed. Jo lavere isolationsniveau, desto større er ydelsesforbedringen i det samtidige system, men dataene i sig selv kan være ufuldstændige.
I SQL Server 2012 kan du indstille isolationsniveauet for en transaktion (fra lav til høj) ved hjælp af denne syntaks:
SÆT TRANSAKTIONSISOLATIONSNIVEAU { LÆS UFORPLIGTET | LÆS FORPLIGTET | GENTAGELIG LÆSNING | SNAPSHOT | SERIENUMMERÉRBAR } [ ; ] Først opretter du et nyt testscript, opretter en database og indsætter testdata som følger:
Opret et nyt vindue A, åbn en transaktion, udfør opdateringsoperationen, og vent 10 sekunder før committ, koden er som følger:
Opret et nyt vindue B, sæt transaktionen READ UNCOMMITTED (Uncommitted read, det laveste niveau, det nemme problem er dirty reading, fordi den kan læse data ændret af andre transaktioner, men ikke committed.) Det gør det samme som at sætte (NOLOCK) på SELECT-sætningsobjekttabellen i en transaktion. Forespørg dataene, koden er som følger:
Opret et nyt vindue C, forespørger dataene direkte, som følger:
Til gengæld,Udfør vinduer A, B og C, og find ud af, at når du opdaterer data, kan vindue B straks returnere data (Det er muligt, at aflæsningen er beskidte data), C-vinduet skal vente på, at A-vinduet er færdigt med at udføre udførelsenvil returnere dataene, som vist i figuren nedenfor:
(Vindue B)
(Vindue C)
(Slut)
|