Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 12282|Svar: 0

[Kilde] SQL Server fastsætter transaktionsisolationsniveauet

[Kopier link]
Opslået på 05/02/2021 11.53.34 | | | |
Entity Framework forespørgselsoptimering WITH(NOLOCK)
https://www.itsvse.com/thread-9513-1-1.html

Database-låse NOLOCK, HOLDLOCK, UPDLOCK, TABLOCK, TABLOCKX
https://www.itsvse.com/thread-9519-1-1.html
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)





Tidligere:Redis-persistensforskel mellem RDB og AOF
Næste:MySQL eksporterer forespørgselsresultaterne til en fil
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com