Następną ciekawą funkcją dostępną w SQL Server 2005 i 2008 jest %%lockres%%
Pokazuje nam ona w pseudokolumnie klucz każdego rekordu (KeyHashValue)
SELECT %%lockres%%,* FROM test
-------------
id tekst dtekst data
------------------ ----------- ----------------------------------------------------
(8194443284a0) 1 abc ABCqazwsx0987qa<..> 2010-12-30 13:41:44.673
(61a06abd401c) 2 abc ABCqazwsx0987qa<..> 2010-12-30 13:44:31.423
To ten magiczny znacznik widzimy w widoku sys.dm_tran_locks w polu resource_description dla typu key, to nim serwer posługuje się przy obsłudze lokowań
W innej sesji odpalamy
BEGIN TRAN
UPDATE test
SET tekst ='abcd'
WHERE id =1
I sprawdzamy
select * from sys.dm_tran_locks
Dzięki takiemu mechanizmowi możemy sprawdzać jakie wiersze są w zablokowane
SELECT a.* FROM test AS a with (NOLOCK)
JOIN sys.dm_tran_locks AS l
ON a.%%lockres%% = l.resource_description
WHERE l.resource_type = 'KEY'
-------------
id tekst dtekst data
------------ ----------------------------------------------------
1 abc ABCqazwsx0987qa<..> 2010-12-30 13:41:44.673
Wartość ta jest przechowywana na poziomie strony
DBCC PAGE (5, 1,20636,3) WITH TABLERESULTS, NO_INFOMSGS
Klucz jest generowany losowo i w tabeli o bardzo dużej ilości danych może się zdarzyc, że klucze się powtórzą, dochodzi wówczas do zablokowania rekordów zupełnie ze sobą niezwiązanych
select %%lockres%% FROM CalkiemSporaTabela --100 mln rekordow
group by %%lockres%%
having count(%%lockres%%)>1
------------
(06006b69f9b0)
.....
.....
(1485 row(s) affected)
Brak komentarzy:
Prześlij komentarz