попробуйте этот запрос, чтобы увидеть процессы блокировки, включая фактический текст запроса SQL:
SELECT
r.session_id AS spid
,r.cpu_time,r.reads,r.writes,r.logical_reads
,r.blocking_session_id AS BlockingSPID
,LEFT(OBJECT_NAME(st.objectid, st.dbid),50) AS ShortObjectName
,LEFT(DB_NAME(r.database_id),50) AS DatabaseName
,s.program_name
,s.login_name
,OBJECT_NAME(st.objectid, st.dbid) AS ObjectName
,SUBSTRING(st.text, (r.statement_start_offset/2)+1,( (CASE r.statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE r.statement_end_offset
END - r.statement_start_offset
)/2
) + 1
) AS SQLText
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text (sql_handle) st
--WHERE r.session_id!=@@SPID --uncomment to not see this query
тупики легко перехватываются с помощью профилировщика:
Попробуйте запустить трассировку в профилировщике(выберите пустой шаблон), выберите «событие графика взаимоблокировки» и на новой появившейся вкладке («Настройки извлечения событий») сохраните каждое (отметьте «сохранять события XML взаимоблокировки отдельно») в своем собственном файле.Откройте этот файл в программе просмотра XML, и вам будет легко узнать, что происходит.Содержится каждый процесс со стеком выполнения вызовов процедур / триггеров и т. Д. И т. Д., И все блокировки также присутствуют.
Посмотрите на раздел «список ресурсов» файла, он покажет, чтоблокируется и удерживается каждым процессом, вызывающим тупик.Выясните, как не заблокировать один из них, и взаимоблокировка будет устранена.
Пусть эта трассировка будет запущена до тех пор, пока не произойдет снова взаимоблокировка, информация записывается только тогда, когда происходит взаимоблокировка, поэтому накладных расходов немного.Если это никогда не повторится, хорошо, что это решено, если нет, вы захватили всю информацию.