Я использовал SQL Profiler для этого. Настройте его с помощью графов Deadlock и Lock: Deadlock events (в разделе «Блокировки»), а также (мой рекомендуемый набор) столбцов SPID, HostName, ApplicationName, LoginName, DatabaseName, ObjectID, ObjectID2, OwnerId, Type, Mode, StartTime, EndTime, Duration и (что наиболее важно) TextData. Запустите его и дайте ему поработать. Если и когда возникают взаимоблокировки, оба события отслеживают полезную информацию, но одно из них (возможно, график взаимоблокировки) отлавливает и записывает тонну полезной информации в виде XML в столбце Текст. Когда строка (событие) выбрана в графическом интерфейсе Profiler, она отобразит графическое изображение, показывающее некоторую полезную информацию ... но что вы делаете, извлекаете XML из столбца TextData (вырезать и вставить отлично работает) и просмотреть его в своем предпочтении Редактор XML, чтобы увидеть практически все, что вы когда-либо захотите узнать о причинах этого $ *% & тупика.
Конечно, для этого вам нужно, чтобы SQL Profiler непрерывно работал на чьем-то компьютере. Если вам нужно подождать несколько часов или дней, чтобы произошла взаимоблокировка, вам нужно будет настроить трассировку на самом сервере. (Сложная тема, подробности читайте в sp_trace_create в Books Online. SQL Profiler - это на самом деле просто графический интерфейс пользователя поверх вызовов Trace.) Запустите их вручную или, как подсказывает @ Chris.w.mclean, вы можете настроить процедура автозапуска, чтобы запустить его, если вы хотите, чтобы он всегда работал (хотя извлечение данных из постоянно работающей трассировки - еще одна сложная проблема). Я также настроил одноразовое задание агента SLQ для запуска трассировок, когда я хочу, чтобы они запускались (обычно, когда я сплю).