SQL Server Lock Escalation explicat
Salut prieteni,
am scris un post pe blog-ul de blocare la nivel de partiție în cazul în care am demonstrat cum încuietori sunt escaladate de la rând la partiție. Postarea de pe blog este aici;
câțiva cititori mi-au scris înapoi întrebându-mă când SQL Server escaladează blocările rândului la blocări la nivel de tabel sau partiție. Deci, în acest post, voi vorbi despre SQL Server lock escaladare.
Ei bine, motorul DB are o componentă numită manager de blocare, care escaladează încuietori cu granulație fină (rânduri& încuietori de pagină) la încuietori cu granulație mai grosieră (partiții sau încuietori de masă) în 2 circumstanțe:
1. Când se atinge pragul de blocare care, conform BOL, este de 5000 (pentru o singură instanță a obiecției în cauză)
2. Când se atinge pragul de memorie pentru Lock Manager, chiar dacă numărul de încuietori prag de 5000 nu este atins.
permiteți-mi să vă demonstrez rapid acest lucru:
am scris următoarea interogare:
USE AdventureWorksGO BEGINTRANUPDATETOP (5000) Person.ContactSET EmailPromotion = 0
puteți vedea că plasez încuietori de 5000 de rânduri, dar când executați SYS.dm_tran_locks DMV, puteți vedea că blocarea tabelului a fost achiziționată.
select*fromsys.dm_tran_lock
Ei bine, acest lucru este perfect în conformitate cu BOL. Cu toate acestea, mă jucam cu numerele și am schimbat valoarea la 4900. Înainte de a rula interogarea de modificare de fiecare dată, nu uitați să ROLLBACK TRAN.
ROLLBACKTRAN BEGINTRANUPDATETOP (4900) Person.ContactSET EmailPromotion = 0
am fugit din nou DMV și de data aceasta, de asemenea, am văzut o blocare de masă. Probabil, de data aceasta m-am așteptat la 4900 de încuietori de rând. Dar poate fi pragul de memorie a fost atins, așa că am continuat să joc cu numerele până când am constatat că pragul de pe sistemul meu este 4707/4708; în cazul în care, dacă numărul de încuietori rând sunt 4708 sau mai mult, motorul DB escaladează acest lucru la o blocare de masă, altceva nimic sub acest număr este acele multe încuietori rând.
deci, dacă am executa următoarele (ROLLBACK orice tranzacție anterioară):
BEGINTRANUPDATETOP (4707) Person.ContactSET EmailPromotion = 0
și apoi verificați DMV, veți vedea cele mai multe încuietori rând. Puteți rula următoarele:
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();
cu toate acestea, când schimb valoarea la 4708, se întâmplă escaladarea. (ROLLBACK tranzacția anterioară)
BEGINTRANUPDATETOP (4708) Person.ContactSET EmailPromotion = 0
rulați din nou DMV:
Write a Reply or Comment