ошибка сервера sql - превышен тайм-аут запроса блокировки - PullRequest
3 голосов
/ 22 декабря 2010

Я получаю сообщение об ошибке «Превышен тайм-аут запроса блокировки» при выполнении запроса выбора.

Я знаю, когда придет эта ошибка. Некоторые транзакции должны блокировать таблицу.

Но мне нужно знать, как это найти.

Обратите внимание, что я не могу проверить его вживую, когда он заблокирован. Как будто это происходило в прошлом, но мне нужно знать, какая была другая транзакция / запрос, который блокировал его в этот раз.

Проще говоря, я хочу, чтобы эти события регистрировались в журналах ошибок sql, когда это происходит, чтобы я мог посмотреть позже и выяснить, кто выполнял длительный запрос, блокирующий его.

Любая идея, как его зарегистрировать. Я попытался установить флаги трассировки и проверить. DBCC TRACEON (1204,1222, -1) Но я не смог найти ничего зарегистрированного, связанного с этим. Заранее спасибо.

1 Ответ

1 голос
/ 22 декабря 2010

На какой версии сервера sql вы работаете?Если вы используете версию, предшествующую SQL 2008, вам нужно будет поработать с нашими ИТ-специалистами, чтобы проанализировать ее вживую.

Если в 2008 году вы можете ретроспективно просматривать события мертвой блокировки, поскольку они отображаются в представлениях управления.Он хранится в формате XML, но вы можете легко его разбить ...

Select 
    DLEvent.XEvent.value('(data/value)[1]', 'varchar(max)') as DeadlockGraph
From
    (
        select CAST(target_data as xml) as DLData
        from sys.dm_xe_session_targets st
        join sys.dm_xe_sessions s 
        on s.address = st.event_session_address
        where name = 'system_health'
    ) AS DLData

CROSS APPLY DLData.nodes ('//RingBufferTarget/event') AS DLEvent (XEvent)

Where DLEvent.XEvent.value('@name', 'varchar(max)') = 'xml_deadlock_report'
...