2010-01-15 6 views
4

J'ai essayé de résoudre différents blocages que nous voyons en production. Nous avons activé le suivi des interblocages. Les traces montrent beaucoup de blocage sur serrures comme ceci:Examiner KEYLOCKs dans SQL Server 2005

01/15/2010 08:25:07,spid15s,Unknown,keylock hobtid=72057594047758336 dbid=2 
objectname=tempdb.dbo.MyTable indexname=IX_MyTable id=lock36977900 mode=X 
associatedObjectId=72057594047758336 

D'après ce que je comprends, le verrouillage des touches verrouille l'index pour empêcher les enregistrements d'être insérés, mis à jour ou supprimé pendant que la transaction fait ses propres insertions, mises à jour, et supprime.

Je suppose qu'il existe des plans de requête incorrects provoquant la demande de mauvais verrous. Je peux exécuter les mêmes requêtes sur mon système de développement et exécuter sp_lock pour examiner les verrous requis par la requête, et je vois quelques KEYLOCKs dans la liste. Comment examine-t-on la gamme de clés que le KEYLOCK bloquait?

Répondre

8

Pour KEY serrures, la valeur de resource dans sp_lock est une valeur de hachage de la clé étant verrouillée.

Les premiers 2 octets sont les 2 octets inférieurs de la valeur de clé, les autres octets sont hash ou la valeur.

Utilisez cette requête pour connaître les lignes étant verrouillé

SELECT * 
FROM mytable 
WHERE %%LOCKRES%% = '{0000ABCDEFAB}' 

, où la chaîne est la valeur de la ressource verrouillée de sp_lock. Si cette requête renvoie deux lignes, vous avez rencontré une collision de hachage assez improbable mais possible, avec une probabilité croissante à mesure que la taille de la table augmente (en raison du paradoxe anniversaire).

+2

Juste une petite note. Cela fonctionnera uniquement pour l'index cluster ou le segment de mémoire. Si la clé que vous recherchez est dans un index non cluster, vous devez utiliser l'indicateur SELECT comme ceci: 'FROM myTable WITH (INDEX (myIndexName))' –

+1

Pour MSSQL2014, il est légèrement changé en WHERE %% LOCKRES %% = ' (0000ABCDEFAB) ' –

2

Ce lien explique prétendument comment le faire. C'est un peu long, donc je ne vais pas le couper et le coller ici, mais quand j'aurai l'occasion de le tester et de le réduire, je posterai un aperçu afin qu'il soit sauvegardé pour toujours.

Forum post on finding the row being key locked