Чтобы смоделировать взаимоблокировку, возьмем базу «Бухгалтерии предприятия КОРП» и в процедуру Обработка проведения документа Требование-накладная добавим следующий код:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
...
Движения.Хозрасчетный.Записать();
Предупреждение("Подождите1");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Хозрасчетный.Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный";
Результат = Запрос.Выполнить();
Предупреждение("Подождите2");
Выполнять его будем так: запустим «1С» в двух сеансах, перепроведем два разных документа Требование-накладная, сначала дойдем в обоих сеансах до останова с помощью модального окна «Подождите1», а потом попытаемся продолжить и дойти до модального окна «Подождите2». В одном из сеансов этого не получится сделать, возникнет взаимоблокировка.
Чтобы разобрать взаимоблокировку с помощью ЦУП, надо сделать следующее:

Рис. 4.18.1. Взаимоблокировка MS SQL Server и настройки для ее записи и анализа

Рис. 4.18.2. Взаимоблокировка MS SQL и подготовка данных для анализа в режиме просмотра

Рис. 4.18.3. Проблемные запросы

Рис. 4.18.4. Проблемные таблицы

Рис. 4.18.5. Расшифровка взаимоблокировки, аналог ее графа
 
Рис. 4.18.6. Параметры запроса. Второй параметр различается
При блокировке строк или диапазонов ключей индекса компонент Database Engine помещает блокировку намерений (см. раздел ) на страницы, содержащие эти строки или ключи. Это мы видим по полю Режим: запросом на запись строки заблокированы в режиме X, а на уровне страниц стоит блокировка намерений IX (см. рис. 4.18.7), которая остается до конца транзакции.

Рис. 4.18.7. Блокировка намерений на уровне страниц, установленная запросом на запись
Запросом на чтение на том же уровне (т. е. на уровне страниц) делается попытка установить блокировку в режиме S (см. рис. 4.18.8). Это уже не блокировка намерений, а «обычная» блокировка, и в общем-то понятно, почему она такая, исходя из написанного запроса.

Рис. 4.18.8. Блокировка на уровне страниц, устанавливаемая запросом на чтение
Если не включено удаление трассировок, то граф взаимоблокировки можно посмотреть, открыв с помощью SQL Profiler соответствующий файл в каталоге трассировки на сервере СУБД. Иногда это бывает полезно. На файлы трассировки может не хватать прав на открытие. Чтобы это обойти, их можно скопировать в том же каталоге (Ctrl + C, Ctrl + V) и открывать копию файла.
Если при анализе встретилась ошибка «Ошибка при вызове метода контекста (РазделитьФайл)», это означает, что файл logcfg.xml остался в состоянии продолжения сбора данных для ЦУП. Обычно остается сбор ТЖ по одному из аналитических показателей. Для обхода ошибки можно переименовать файл logcfg.xml вручную и повторить попытку анализа, а уже потом разобраться с причинами, вызвавшими эту ошибку.
Следует иметь в виду еще одну вещь: взаимоблокировки и таймауты, которые показывает ЦУП, могут происходить не обязательно в рабочей базе, они могут возникать на самом деле в других базах, а не в исследуемой. Это связано с методикой их получения, которая не дает информации о том, в какой из баз на сервере СУБД произошла ошибка блокировок. Поэтому вместе с аналитическими показателями нужно записывать статистику по запросам: ошибок блокировок без запросов не бывает.