Wyjaśniono eskalację blokady SQL Server
Cześć przyjaciele,
napisałem post na blogu o blokowaniu na poziomie partycji, w którym zademonstrowałem, w jaki sposób blokady są eskalowane z rzędu na partycję. Wpis na blogu jest tutaj;
kilku czytelników odpisało do mnie z pytaniem Kiedy SQL Server eskaluje blokady wierszy do blokad na poziomie tabeli lub partycji. W tym poście opowiem o eskalacji blokady SQL Server.
Cóż, silnik DB ma komponent o nazwie Lock Manager, który eskaluje zamki drobnoziarniste (rzędy & zamki stronicowe) do bardziej gruboziarnistych zamków (zamki przegródkowe lub stołowe) w 2 okolicznościach:
1. Po osiągnięciu progu blokady, który według BOL wynosi 5000 (dla pojedynczej instancji rozpatrywanego sprzeciwu)
2. Po osiągnięciu progu pamięci dla Lock Managera, nawet jeśli nie zostanie osiągnięty próg liczby zamków wynoszący 5000.
pozwól, że ci to szybko zademonstruję:
napisałem następujące zapytanie:
USE AdventureWorksGO BEGINTRANUPDATETOP (5000) Person.ContactSET EmailPromotion = 0
możesz zobaczyć, że umieszczam 5000 blokad wierszy, ale po uruchomieniu SYS. dm_tran_locks DMV, możesz zobaczyć, że blokada tabeli została przejęta.
select*fromsys.dm_tran_lock
Cóż, to idealnie pasuje do BOL. Jednak bawiłem się liczbami i zmieniłem wartość na 4900. Przed każdym uruchomieniem zapytania o modyfikację nie zapomnij wycofać TRAN.
ROLLBACKTRAN BEGINTRANUPDATETOP (4900) Person.ContactSET EmailPromotion = 0
ponownie uruchomiłem DMV i tym razem również zobaczyłem blokadę stołu. Prawdopodobnie, tym razem spodziewałem się 4900 zamków rzędowych. Ale może być próg pamięci został osiągnięty, więc kontynuowałem grę z numerami, dopóki nie odkryłem, że próg w moim systemie to 4707/4708; gdzie jeśli liczba blokad wiersza wynosi 4708 lub więcej, silnik DB eskaluje to do blokady stołu, w przeciwnym razie wszystko poniżej tej liczby to te wiele blokad wiersza.
więc jeśli wykonam następujące czynności (wycofam każdą wcześniejszą transakcję):
BEGINTRANUPDATETOP (4707) Person.ContactSET EmailPromotion = 0
A potem sprawdź w wydziale komunikacji, zobaczysz te liczne zamki. Możesz uruchomić następujące:
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();
jednak kiedy zmieniam wartość na 4708, następuje eskalacja. (Wycofaj wcześniejszą transakcję)
BEGINTRANUPDATETOP (4708) Person.ContactSET EmailPromotion = 0
Uruchom ponownie DMV:
Write a Reply or Comment