sql >> Database teknologi >  >> RDS >> Sqlserver

Lock Escalation - Hvad sker der her?

"Låseskalering " er, hvordan SQL håndterer låsning til store opdateringer. Når SQL skal ændre mange rækker, er det mere effektivt for databasemotoren at tage færre, større låse (f.eks. hele tabellen) i stedet for at låse mange mindre ting (f.eks. rækkelåse)

Men dette kan være problematisk, når du har et stort bord, fordi det kan låse andre forespørgsler ude i lang tid, hvis du låser hele bordet. Det er afvejningen:mange låse med lille granularitet er langsommere end færre (eller én) grovkornede låse, og at have flere forespørgsler, der låser forskellige dele af en tabel, skaber mulighed for dødvande, hvis en proces venter på en anden.

Der er en mulighed på tabelniveau, LOCK_ESCALATION , nyt i SQL 2008, som tillader kontrol af låseeskalering. Standarden "TABEL" tillader låse at eskalere hele vejen til tabelniveau. DISABLE forhindrer låseskalering til hele bordet i de fleste tilfælde. AUTO tillader bordlåse, undtagen hvis bordet er partitioneret, i hvilket tilfælde låse kun laves op til partitionsniveauet. Se dette blogindlæg for mere info.

Jeg formoder, at IDE tilføjer denne indstilling, når der genskabes en tabel, fordi TABLE er standard i SQL 2008. Bemærk, at LOCK_ESCALATION ikke understøttes i SQL 2005, så du bliver nødt til at fjerne den, hvis du prøver at køre scriptet på en 2005 eksempel. Da TABLE er standard, kan du også sikkert fjerne den linje, når du kører dit script igen.

Bemærk også, at i SQL 2005, før denne indstilling var til stede, kunne alle låse eskalere til tabelniveau - med andre ord, "TABLE" var den eneste indstilling på SQL 2005.



  1. Henter data fra MySQL-database til html-rulleliste

  2. MariaDB introducerer TO_CHAR()

  3. Php multiple db miljø med git &phpfog

  4. Opdatering af AUTO_INCREMENT-værdi for alle tabeller i en MySQL-database