Vilken rad var det som var låst sa du?

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

Om man felsöker låsningar i Microsoft SQL Server träffar man ibland på lås av typen KEY, som i sin tur pekar på ett resource värde. Och då vill man såklart veta vilken KEY (Nyckelvärde) som är låst. Och hur gör man det? Jo, men hjälp av den odokumenterade virtuella kolumnen %%lockres%% !

Om du kör följande kod, får du fram alla KEY locks: SELECT * from sys.dm_tran_locks where resource_type = ‘KEY’ Titta sedan i kolumnen resource_description efter värdet vi letar efter, det ser ut ungefär såhär: (06030b3953d6) och är ett hashvärde genererat från nyckeln i vårt klustrade index, anternativt RID värdet om det är en HEAP tabell. Spara resource_description värdet. Ta med värdet kolumnen resource_associated_entity_id till följande fråga: select * from sys.partitions where partition_id = xxxxxxxxxxxx Från den frågan tar du med dig värdet i object_id till frågan: select * from sys.objects where object_id = xxxxxxxxx Då får du ut namnet på tabellen, som du tar med dig i nästa fråga tillsammans med ditt ursprungliga resource_description värde ungefär såhär, så får du fram vilken rad som är låst: SELECT %%lockres%%, * FROM [Dbprod].[dbo].[XXXXXXX] where %%lockres%% = ‘(06030b3953d6)’

Detta är särskilt användbart när man felsöker blockeringar, och vil veta exakt vilken rad problemet uppstår på.

Om du behöver hjälp med felsökning eller prestandaoptimering i SQL server, kontakta oss så hjälper någon av våra SQL Server konsulter dig!