Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
beaver06 Member Откуда: Сообщений: 681 |
Добрый день! Подскажите пожалуйста, каким образом можно отследить какую таблицу заблокировали, например более чем на 15 секунд? Спасибо |
23 сен 13, 11:06 [14871323] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
beaver06, Если заранее не настроить трассировку либо сессию XEvents, то никак не узнать. Лучше расскажите, какую задачу вы решаете. |
23 сен 13, 12:10 [14871804] Ответить | Цитировать Сообщить модератору |
beaver06 Member Откуда: Сообщений: 681 |
Гость333, в 1С периодически возникает проблема с подозрением на монопольную блокировку целой таблицы. Коллеги оттуда попросили ловить такие блокировки, с длительностью более 15 сек. |
23 сен 13, 12:20 [14871891] Ответить | Цитировать Сообщить модератору |
Гость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] Ответить | Цитировать Сообщить модератору |
beaver06 Member Откуда: Сообщений: 681 |
Гость333, спасибо. Попробую.. |
23 сен 13, 13:19 [14872369] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |