Изучение KEYLOCK в SQL Server 2005 - PullRequest
4 голосов
/ 15 января 2010

Я пытался решить различные тупики, которые мы видим в производстве. Мы включили отслеживание тупиковой ситуации. Следы показывают много блокировок на КЛЮЧЕВЫХ КЛЮЧАХ как это:

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

Насколько я понимаю, блокировка клавиатуры блокирует индекс, чтобы предотвратить вставку, обновление или удаление записей, когда транзакция выполняет свои собственные операции вставки, обновления и удаления.

Я предполагаю, что существуют плохие планы запросов, из-за которых запрашиваются плохие блокировки. Я могу выполнить те же запросы в моей системе разработки и запустить sp_lock для проверки блокировок требуемого запроса, и я вижу некоторые KEYLOCK в списке. Как проверить диапазон ключей, которые блокировал KEYLOCK?

Ответы [ 2 ]

8 голосов
/ 15 января 2010

Для KEY блокировок значение resource в sp_lock является хешированным значением блокируемого ключа.

Первые 2 байты являются младшими 2 байтами значения ключа, остальные байты являются hash или значением.

Используйте этот запрос, чтобы узнать, какие строки заблокированы:

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

, где строка - это значение заблокированного ресурса из sp_lock.

Если этот запрос возвращает две строки, то вы столкнулись с коллизией хешей, которая является невероятной, но возможной, причем вероятность возрастает с увеличением размера таблицы (из-за парадокса дня рождения).

2 голосов
/ 15 января 2010

Эта ссылка предположительно объясняет, как это сделать. Это немного долго, поэтому я не собираюсь вырезать и вставлять его здесь, но когда у меня будет возможность протестировать и сократить его, я опубликую обзор, чтобы он всегда сохранялся на SO.

Сообщение на форуме о том, что строка заблокирована

...