Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Расшифровка значений о блокировке  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
На прикрепленном рисунке отображено поле в котором информация о блокировке, есть вопросы, начну по порядку:

1. 36,671 - кол-во сек ожидания освобождения ресурсов, необходимых для транзакции
2. LCK_M_S - показывает что происходит совместная блокировка (верно ли???)
3. Key - блокировка накладывается на строку (кластерный индекс)
4. 5 - ID БД

5. 720576... - если я правильно понял то это - Идентификатор сущности в базе данных, с которой связан ресурс Это может быть идентификатор объекта, идентификатор Hobt или идентификатор единицы распределения в зависимости от типа ресурса. Вопрос как понять что это за объект. Если это строка таблица то как понять что это за таблица. Учитывая что SPID того сеанса уже занят другим пользователем.

6. (0100dcb510e5) - а что это такое идей не осталось, хотя возможно это поле resource_description у системной вьюхи sys.dm_tran_locks

К сообщению приложен файл. Размер - 1Kb
14 мар 12, 14:33    [12246472]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка значений о блокировке  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Ну и в общем если кто может прокомментировать по пунктам, может что не правильно сказал :)
14 мар 12, 14:37    [12246497]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка значений о блокировке  [new]
Glory
Member

Откуда:
Сообщений: 104751
andrew shalaev
5. 720576... - если я правильно понял то это - Идентификатор сущности в базе данных, с которой связан ресурс Это может быть идентификатор объекта, идентификатор Hobt


HoBt ID - This value corresponds to sys.partitions.hobt_id.
14 мар 12, 14:38    [12246502]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка значений о блокировке  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
0100dcb510e5 - это хеш. Понять по нему что-то без перебора всех ключей и расчета этого значения не выйдет.
14 мар 12, 14:38    [12246507]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка значений о блокировке  [new]
AndyD
Guest
Гавриленко Сергей Алексеевич
0100dcb510e5 - это хеш. Понять по нему что-то без перебора всех ключей и расчета этого значения не выйдет.

Да, это хэш, но получить это значение можно простым запросом
select %%lockres%%, *
from table


Хэш существует не только у строки таблицы, но и у индексной записи.
Т.е., этот запрос будет возвращать другие значения хэша (если указывать не кластерный индекс, естественно)
select %%lockres%%, *
from table with (index (index_name))


Можно делать и поиск по этому столбцу
select *
from table
where %%lockres%% = '(0100dcb510e5)'


Так же и для индеска
select *
from table with (index (index_name))
where %%lockres%% = '(хэш индекса)'


Только если записей много выбираться будет долго - сканируются все страницы таблицы или индекса
14 мар 12, 15:26    [12246875]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка значений о блокировке  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
AndyD,

А как определить к какой таблице относится хэш записи?
14 мар 12, 15:33    [12246931]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка значений о блокировке  [new]
AndyD
Guest
andrew shalaev
AndyD,

А как определить к какой таблице относится хэш записи?


Лучше пример покажу:)

SELECT 
        case t1.resource_type
			when N'OBJECT' then OBJECT_NAME(t1.resource_associated_entity_id)
			when N'KEY' then (select OBJECT_NAME(object_id) FROM sys.partitions where partition_id = t1.resource_associated_entity_id)
			when N'PAGE' then (select OBJECT_NAME(object_id) FROM sys.partitions where partition_id = t1.resource_associated_entity_id)
			when N'HOBT' then (select OBJECT_NAME(object_id) FROM sys.partitions where partition_id = t1.resource_associated_entity_id)
			when N'RID' then (select OBJECT_NAME(object_id) FROM sys.partitions where hobt_id = t1.resource_associated_entity_id)
			else N'Unknown'
        end as Text,
        case t1.resource_type
			when N'KEY' then (select [indexes].name 
							  FROM sys.partitions join sys.[indexes] on partitions.object_id=indexes.object_id and partitions.index_id=indexes.index_id
							  where partitions.partition_id = t1.resource_associated_entity_id)
			else N'Unknown'
        end as IndexName,
        t1.request_session_id, 
        t1.*,
        t2.transaction_begin_time,
        t2.transaction_type
    FROM sys.dm_tran_locks as t1
    left join sys.dm_tran_active_transactions as t2 on t1.request_owner_id = t2.transaction_id
    where resource_type <> 'DATABASE'
    order by t1.resource_database_id, t1.request_session_id


720576... - это и есть dm_tran_locks.resource_associated_entity_id

Кстати, Key - это блокировка на индексную запись.
Другое дело, что для кластерного индекса она совпадает со строкой данных
14 мар 12, 15:45    [12247062]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка значений о блокировке  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
Еще одну блокировку рассматриваю...
На сей раз spid 743 ждет таблицу залакированную процессом 589.
Пробую определить имя таблицы по id

select OBJECT_NAME(1841477730)

в ответ получаю NULL

что это означает? то что в данной БД нет таблицы с таким идентификатором? или я не правильно пытаюсь узнать имя заблокированной таблицы?

К сообщению приложен файл. Размер - 4Kb
16 мар 12, 11:40    [12258864]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка значений о блокировке  [new]
AndyD
Member

Откуда:
Сообщений: 30
OBJECT_NAME() работает в контексте выбранной базы данных.
Используйте
use work5nt;
перед вызовом
16 мар 12, 11:51    [12259009]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка значений о блокировке  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
AndyD,

абсолютно верно :)
спасибо
16 мар 12, 11:53    [12259032]     Ответить | Цитировать Сообщить модератору
 Re: Расшифровка значений о блокировке  [new]
AndyD
Member

Откуда:
Сообщений: 30
Либо в вызове object_name() указывайте id базы данных
select object_name(1841477730), DB_ID('work5nt'))
16 мар 12, 11:54    [12259042]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить