Serverlås eskalering forklaret
Hej Venner,
jeg skrev et blogindlæg om partition-niveau låsning, hvor jeg demonstrerede, hvordan låse eskaleres fra række til partition. Blogindlægget er her;
et par læsere skrev tilbage til mig og spurgte, hvornår eskalerer rækkelåsene til tabel-eller partitionsniveaulåse. Så i dette indlæg vil jeg tale om eskalering af Serverlås.
nå, DB-motoren har en komponent kaldet Lock Manager, som eskalerer finkornede låse (rækker& sidelåse) til mere grovkornede låse (partition eller bordlåse) under 2 omstændigheder:
1. Når låsetærsklen er nået, som pr.BOL er 5000 (for en enkelt forekomst af den pågældende indsigelse)
2. Når hukommelsestærsklen er nået for Lock Manager, selvom antallet af låse tærskel på 5000 ikke er nået.
Lad mig hurtigt demonstrere dette for dig:
jeg skrev følgende forespørgsel:
USE AdventureWorksGO BEGINTRANUPDATETOP (5000) Person.ContactSET EmailPromotion = 0
du kan se, at jeg placerer 5000 RÆKKELÅSE, men når du kører sys.dm_tran_locks DMV, kan du se, at tabellåsen er erhvervet.
select*fromsys.dm_tran_lock
nå, det er helt i tråd med BOL. Men jeg spillede rundt med tallene, og jeg ændrede værdien til 4900. Før du kører ændringsforespørgslen hver gang, skal du ikke glemme at rulle TRAN tilbage.
ROLLBACKTRAN BEGINTRANUPDATETOP (4900) Person.ContactSET EmailPromotion = 0
jeg kørte igen DMV og denne gang så jeg også en bordlås. Sandsynligvis, denne gang forventede jeg 4900 række låse. Men det kan være, at hukommelsestærsklen blev nået, så jeg fortsatte med at spille med tallene, indtil jeg fandt ud af, at tærsklen på mit system er 4707/4708; hvor hvis antallet af RÆKKELÅSE er 4708 eller mere, eskalerer DB-motoren dette til en tabellås, ellers er noget under dette nummer de mange rækkelåse.
så hvis jeg udfører følgende (ROLLBACK enhver tidligere transaktion):
BEGINTRANUPDATETOP (4707) Person.ContactSET EmailPromotion = 0
og så tjek DMV, du skal se de mange række låse. Du kan køre følgende:
select resource_type,resource_database_id,resource_description,resource_associated_entity_id,request_mode,request_type,request_statusfrom sys.dm_tran_lockswhere resource_database_id = DB_ID();
men når jeg ændrer værdien til 4708, sker eskalering. (ROLLBACK den tidligere transaktion)
BEGINTRANUPDATETOP (4708) Person.ContactSET EmailPromotion = 0
Kør DMV igen:
Write a Reply or Comment