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

Откуда:
Сообщений: 681
Добрый день!

Подскажите пожалуйста, каким образом можно отследить какую таблицу заблокировали, например более чем на 15 секунд?
Спасибо
23 сен 13, 11:06    [14871323]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка всей таблицы  [new]
beaver06
Member

Откуда:
Сообщений: 681
Можно посмотреть так:

SELECT TL.resource_type AS ResType
,TL.resource_description AS ResDescr
,TL.request_mode AS ReqMode
,TL.request_type AS ReqType
,TL.request_status AS ReqStatus
,TL.request_owner_type AS ReqOwnerType
,TAT.[name] AS TransName
,TAT.transaction_begin_time AS TransBegin
,DATEDIFF(ss, TAT.transaction_begin_time, GETDATE()) AS TransDura
,ES.session_id AS S_Id
,ES.login_name AS LoginName
,COALESCE(OBJ.name, PAROBJ.name) AS ObjectName
,PARIDX.name AS IndexName
,ES.host_name AS HostName
,ES.program_name AS ProgramName
FROM sys.dm_tran_locks AS TL
INNER JOIN sys.dm_exec_sessions AS ES
ON TL.request_session_id = ES.session_id
LEFT JOIN sys.dm_tran_active_transactions AS TAT
ON TL.request_owner_id = TAT.transaction_id
AND TL.request_owner_type = 'TRANSACTION'
LEFT JOIN sys.objects AS OBJ
ON TL.resource_associated_entity_id = OBJ.object_id
AND TL.resource_type = 'OBJECT'
LEFT JOIN sys.partitions AS PAR
ON TL.resource_associated_entity_id = PAR.hobt_id
AND TL.resource_type IN ('PAGE', 'KEY', 'RID', 'HOBT')
LEFT JOIN sys.objects AS PAROBJ
ON PAR.object_id = PAROBJ.object_id
LEFT JOIN sys.indexes AS PARIDX
ON PAR.object_id = PARIDX.object_id
AND PAR.index_id = PARIDX.index_id
WHERE TL.resource_database_id = DB_ID()
AND ES.session_id <> @@Spid -- Exclude "my" session
-- optional filter
AND TL.request_mode <> 'S' -- Exclude simple shared locks
ORDER BY TL.resource_type
,TL.request_mode
,TL.request_type
,TL.request_status
,ObjectName
,ES.login_name;



А как посмотреть время длительности блокировки?
23 сен 13, 11:58    [14871723]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка всей таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
beaver06,

Если заранее не настроить трассировку либо сессию XEvents, то никак не узнать.
Лучше расскажите, какую задачу вы решаете.
23 сен 13, 12:10    [14871804]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка всей таблицы  [new]
beaver06
Member

Откуда:
Сообщений: 681
Гость333,
в 1С периодически возникает проблема с подозрением на монопольную блокировку целой таблицы.
Коллеги оттуда попросили ловить такие блокировки, с длительностью более 15 сек.
23 сен 13, 12:20    [14871891]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка всей таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Можно использовать системное представление sys.dm_os_waiting_tasks, в нём есть столбец wait_duration_ms — сколько миллисекунд процесс ожидает наложения требуемой блокировки. Подключить к своему запросу можете так:
    INNER JOIN sys.dm_os_waiting_tasks as WT ON WT.resource_address = TL.lock_owner_address
...
WHERE WT.wait_duration_ms > 15000

Этим нельзя отследить ситуацию "некий процесс долго блокирует таблицу, но никому не мешает, т.к. пока таблица никому не нужна", можно только ситуацию "некий процесс долго блокирует таблицу и мешает другому наложить блокировку".
23 сен 13, 12:46    [14872126]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка всей таблицы  [new]
beaver06
Member

Откуда:
Сообщений: 681
Гость333,

спасибо.
Попробую..
23 сен 13, 13:19    [14872369]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить