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ść:
1 2 3 4 5 6 7 |
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:
1 2 3 4 5 6 |
SELECT @@SPID BEGIN TRAN UPDATE ##test_blog SET col1 = 'test' WHERE id = 1 |
Otwieramy drugie okno i sprawdzamy locki dla sesji 73:
1 |
sp_lock 73 |
Sprawdzamy zatem, co kryje się pod magicznym 5:75840:0 ?
1 |
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:
1 2 3 4 5 6 7 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ć:
1 |
SELECT %%lockres%%,* FROM ##test_blog (NOLOCK) |