sql >> Databasteknik >  >> RDS >> Sqlserver

Lock Escalation - Vad händer här?

"Låseskalering " är hur SQL hanterar låsning för stora uppdateringar. När SQL ska ändra många rader är det mer effektivt för databasmotorn att ta färre, större lås (t.ex. hela tabellen) istället för att låsa många mindre saker (t.ex. radlås)

Men detta kan vara problematiskt när du har ett stort bord, eftersom att låsa hela bordet kan låsa andra frågor under lång tid. Det är avvägningen:många lås med liten granularitet är långsammare än färre (eller ett) grovkorniga lås, och att ha flera frågor som låser olika delar av en tabell skapar möjligheten för dödläge om en process väntar på en annan.

Det finns ett alternativ på tabellnivå, LOCK_ESCALATION , nytt i SQL 2008, som tillåter kontroll av låseskalering. Standardinställningen "TABELL" tillåter lås att eskalera hela vägen till tabellnivå. DISABLE förhindrar låseskalering till hela bordet i de flesta fall. AUTO tillåter tabelllås utom om tabellen är partitionerad, i vilket fall låses endast upp till partitionsnivån. Se det här blogginlägget för mer information.

Jag misstänker att IDE lägger till den här inställningen när en tabell återskapas eftersom TABLE är standard i SQL 2008. Observera att LOCK_ESCALATION inte stöds i SQL 2005, så du måste ta bort den om du försöker köra skriptet på en 2005 exempel. Dessutom, eftersom TABLE är standard, kan du säkert ta bort den raden när du kör ditt skript igen.

Observera också att i SQL 2005 innan den här inställningen fanns kunde alla lås eskalera till tabellnivå - med andra ord, "TABLE" var den enda inställningen i SQL 2005.



  1. SQL SUM-funktion utan att gruppera data

  2. PHP/MySQL försöker få TIMESTAMPDIFF att mata ut ett resultat

  3. Bästa sättet att lagra tid över 24:00:00 i postgresql?

  4. mysql radera vid join?