Jeg plejede at se mine seniorudviklere bruge WITH (NOLOCK), når de forespørgsler i SQL Server, og jeg undrer mig over, hvorfor de bruger det. Nu har jeg undersøgt det og fundet ud af, at det er nyttigt til at forbedre ydeevnen i udførelsen af forespørgslen. Der er dog en ulempe ved at bruge det. Ulempen er, at man måske ikke er sikker på, at man får de data, der aktuelt opdateres i tabellen, dvs. uden låsebeskyttelse kan man ikke garantere, at dataene ikke er det ændrer sig i den periode, hvor forespørgslen kører. Jeg henviste til dette link og fandt det ret nyttigt.
For at forbedre SQL-forespørgselsydelsen er det første formål generelt at oprette et indeks. Faktisk, ud over etableringen af indekser, kan tilføjelsen af en sektion WITH (NOLOCK) til syntaksen forbedre fænomenet med datasæt, der bliver LOCKet i et miljø med et stort antal online forespørgsler, og dermed forbedre forespørgselsydelsen.
Dog er det vigtigt at bemærke, at SQL SELECT med (NOLOCK) kan forårsage en beskidt læsning.
For eksempel:
Fordi SQL Server udfører den tilsvarende låskonsistenskontrol. For at forbedre den samlede databaseforespørgselsydelse, tilføj WITH (NOLOCK) til slutningen af tabelnavnet i din SELECT-syntaks, selvom (NOLOCK) også er acceptabelt, men Microsoft anbefaler stadig at tilføje WITH.
Ud over simpel SELECT kan du også bruge SELECT-syntaks med JOIN. Men DELETE, INSERT, UPDATE og andre kommandoer, der kræver transaktioner, er ikke gode...
Nogle filer siger, at effektiviteten af SQL-forespørgsler kan øges med 33 % med WITH (NOLOCK). Tilføjelsen af WITH (NOLOCK) fortæller SQL Server, at vores SELECT-kommando ikke behøver at tage højde for transaktionslåsetilstanden for den aktuelle tabel, så ydeevnen vil blive væsentligt forbedret, og låsefænomenet i databasesystemet vil blive væsentligt reduceret (inklusive deadlock).
En ting at bemærke er, at fordi WITH (NOLOCK) ikke tager højde for transaktionslåsen for den aktuelle tabel, så når der er data i flere faser af en transaktion (f.eks. en transaktion på tværs af flere tabeller – > som et udbetalingssystem), vil WITH (NOLOCK) ignorere de data, der aktuelt behandler transaktionsprocessen...
For at sige det ligeud, det vil sige, når man bruger NoLock, tillader det at læse data, der er blevet ændret, men hvor transaktionen endnu ikke er gennemført. Derfor, hvis du skal overveje transaktionsdatas realtidsintegritet, bør du overveje nøje at bruge WITH (NOLOCK).
Hvis du ikke behøver at overveje transaktioner, kan WITH (NOLOCK) være en nyttig reference.
Note 1: MED ( < table_hint > ) Angiver tabelscanningen, et eller flere indekser brugt af forespørgselsoptimereren, Eller ved forespørgselsoptimeringen til at udnytte denne datatabel og bruge låsetilstanden til denne sætning.
Note 2: WITH (NOLOCK) svarer til READ UNCOMMITTED
Lad os til sidst tale om nogle små forskelle mellem nolock og with(nolock): 1: Synonymer i SQL05, kun med (nolock), understøttes; 2: med (nolock) skrives meget nemt og derefter specificeres indekset. Når du forespørger sætninger på tværs af servere, kan du ikke bruge med (nolock), kun nolock Når man forespørger på samme server, kan både med (nolock) og nolock bruges Som hvad SQL-kode vælg * fra [IP].a.dbo.table1 med (nolock) Dette vil give dig fejlen select * fra a.dbo.table1 med (nolock) Det vil virke |