SQL Server Lock Escalation explained
Hi Friends,
kirjoitin partition-tason lukitusta käsittelevän blogikirjoituksen, jossa demonstroin, miten lukot eskaloituvat rivistä osioon. Blogikirjoitus on täällä;
muutama lukija kirjoitti minulle takaisin kysyen, milloin SQL Server eskaloi rivilukot pöytä-tai osiotason lukkoihin. Joten tässä viestissä, aion puhua SQL Server Lukko eskalaatio.
no, DB-moottorissa on Lukkopäällikkö-niminen komponentti, joka laajentaa Hienorakeiset lukot (rivit & sivulukot) karkearakeisempiin lukkoihin (väli-tai pöytälukot) 2-olosuhteissa:
1. Kun saavutetaan sulkukynnys, joka BOL: n mukaan on 5000 (yksittäisen vastaväitteen osalta)
2. Kun Lukkopäällikön muistikynnys saavutetaan, vaikka lukkojen määrä-raja 5000 jää saavuttamatta.
anna minun nopeasti osoittaa tämä sinulle:
kirjoitin seuraavan kyselyn:
USE AdventureWorksGO BEGINTRANUPDATETOP (5000) Person.ContactSET EmailPromotion = 0
näet, että asetan 5000 RIVILUKKOA, mutta kun suoritat sys.dm_tran_locks DMV: tä, näet, että pöytälukko on hankittu.
select*fromsys.dm_tran_lock
No, tämä sopii täydellisesti yhteen Bolin kanssa. Leikittelin kuitenkin numeroilla ja vaihdoin arvon 4900: aan. Ennen kuin suoritat muutos kysely joka kerta, älä unohda ROLLBACK TRAN.
ROLLBACKTRAN BEGINTRANUPDATETOP (4900) Person.ContactSET EmailPromotion = 0
juoksin taas KATSASTUSKOPIN ja tälläkin kertaa näin pöytälukon. Luultavasti tällä kertaa odotin 4900 RIVILUKKOA. Mutta voi olla muistin kynnys saavutettiin, joten jatkoin pelaa numerot kunnes huomasin, että kynnys minun järjestelmä on 4707/4708; jos RIVILUKKOJEN määrä on 4708 tai enemmän, DB Moottori laajentaa tämän taulukon Lukko, muuten mitään alle että Numero on ne monet rivi lukot.
joten jos suoritan seuraavan (peruuta jokin aikaisempi tapahtuma):
BEGINTRANUPDATETOP (4707) Person.ContactSET EmailPromotion = 0
tarkistakaa ajoneuvorekisteristä, niin näette monta lukkoa. Voit ajaa seuraavia:
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();
kuitenkin, kun muutan arvon 4708, eskalaatio tapahtuu. (Aiemman liiketoimen peruuttaminen)
BEGINTRANUPDATETOP (4708) Person.ContactSET EmailPromotion = 0
Run the DMV again:
Write a Reply or Comment