Znalezienie lockowanego rekordu po RID lub hash value przy użyciu wirtualnej kolumny %%lockres%%

Często gęsto analizujemy jakiegoś locka. Dowiadujemy się jaki jest jego RID

lub hash klucza:

I zadajemy sobie teraz pytanie…

OK, wiem która to baza, wiem który to obiekt. Ale skąd mam wiedzieć o jaki rekord może chodzić??

 

Z pomocą przychodzi wirtualna nieudokumentowana kolumna %%lockres%%, która zwraca właśnie powyższe wartości 🙂

 

Przykład:

Tworzymy tabelkę dostatecznie dużą i sprawdzamy zawartość:

CREATE TABLE ##test_blog (id INT IDENTITY, col1 NVARCHAR(100) DEFAULT 'wartosc')
GO

INSERT INTO ##test_blog DEFAULT VALUES
GO 10

SELECT * FROM ##test_blog

 

Ok, pora na locka. Tabela jest w tej chwili stertą. Sprawdzamy jaki mamy SPID i wykonujemy update w transakcji, której nie zamykamy:

SELECT @@SPID

BEGIN TRAN
UPDATE ##test_blog
SET col1 = 'test'
WHERE id = 1

 

Otwieramy drugie okno i sprawdzamy locki dla sesji 73:

sp_lock 73

 

Sprawdzamy zatem, co kryje się pod magicznym 5:75840:0  ?

 

SELECT %%lockres%%,* FROM ##test_blog (NOLOCK) WHERE %%lockres%% = '5:75840:0'

 

Wykonujemy w pierwszym oknie rollback, następnie zakładamy klucz główny.

Wykopnajmy teraz UPDATE wiersza np 8:

ROLLBACK

ALTER TABLE ##test_blog ADD PRIMARY KEY (id)

BEGIN TRAN
UPDATE ##test_blog
SET col1 = 'test'
WHERE id = 8

W drugim oknie sprawdzamy znów wynik sp_lock 73:

 

Tym razem mamy exclusive na kluczu, tylko że jest to jego hash. Nie wiemy co kryje się za c9fb1da9313f , ale również możemy to sprawdzić:

SELECT %%lockres%%,* FROM ##test_blog (NOLOCK)

 

Dodaj komentarz