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)