SQL Server Lock Escalation explained
Hi Friends,
Ik heb een blog post geschreven over het vergrendelen op partitieniveau waar ik heb aangetoond hoe vergrendelingen worden geëscaleerd van rij naar partitie. De blog post is hier;
een paar lezers schreven terug naar mij met de vraag wanneer SQL Server de rij sloten escaleert naar tabel of partitie niveau sloten. Dus in dit bericht, Ik zal praten over SQL Server Lock escalatie.
wel, de DB-motor heeft een component genaamd de Lock Manager, die fijnkorrelige sloten (rijen & paginablokkeringen) escaleert naar meer grofkorrelige sloten (partitie-of tabelsloten) onder 2 omstandigheden:
1. Bij het bereiken van de drempelwaarde die per BOL gelijk is aan 5000 (voor een enkel geval van het bezwaar in kwestie)
2. Wanneer de geheugendrempel voor Lock Manager is bereikt, zelfs als het aantal locks drempel van 5000 niet is bereikt.
laat me dit snel demonstreren:
ik schreef de volgende query:
USE AdventureWorksGO BEGINTRANUPDATETOP (5000) Person.ContactSET EmailPromotion = 0
u kunt zien dat ik 5000 RIJVERGRENDELINGEN plaats, maar als u de sys. dm_tran_locks DMV uitvoert, kunt u zien dat tabelvergrendeling is verworven.
select*fromsys.dm_tran_lock
Dit is perfect in lijn met BOL. Echter, Ik was aan het spelen met de nummers en ik veranderde de waarde naar 4900. Voordat u de modificatiequery elke keer uitvoert, vergeet dan niet TRAN terug te draaien.
ROLLBACKTRAN BEGINTRANUPDATETOP (4900) Person.ContactSET EmailPromotion = 0
ik heb de DMV opnieuw uitgevoerd en ook deze keer zag ik een tafelvergrendeling. Waarschijnlijk, deze keer verwachtte ik 4900 rij sloten. Maar misschien was de geheugendrempel bereikt, dus ik bleef spelen met de nummers totdat ik vond dat de drempel op mijn systeem 4707/4708; waar als het aantal rij sloten 4708 of meer zijn, de DB Motor escaleert dit naar een tafel slot, anders iets onder dat aantal is die vele rij sloten.
dus als ik het volgende uit te voeren (terugdraaien van een eerdere transactie):
BEGINTRANUPDATETOP (4707) Person.ContactSET EmailPromotion = 0
en controleer dan de RDW, je zult die vele rijsloten zien. U kunt het volgende uitvoeren:
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();
echter, wanneer ik verander de waarde 4708, escalatie gebeurt. (Terugdraaien van de eerdere transactie)
BEGINTRANUPDATETOP (4708) Person.ContactSET EmailPromotion = 0
voer de DMV opnieuw uit:
Write a Reply or Comment