Таймаут при ожидании блокировки

Для расследования причин возникновения таймаутов при ожидании блокировки можно воспользоваться сервисом анализа технологического журнала. Здесь указано как его настроить.

При таймауте пользователям выдается сообщение:

Конфликт блокировки при выполнении транзакции
 
Превышено максимальное время ожидания предоставления блокировки

После сбора технологического журнала и загрузки его в сервис, формируем произвольный запрос по таблице TTIMEOUT. Нам понадобятся поля processName, waitConnections, Context и dateTime.

анализ таймаута блокировки 1С

В результате запроса видим список сообщений о блокировке и контекст, который не смог выполниться.

анализ таймаута блокировки 1С

Таблицу сохраняем, формируем второй запрос, теперь по таблице TLOCK, в отборы указываем имя базы (processName) и номер соединения waitConnections из первого запроса. Поля выберем regions, locks, durationus, dateTime и context.

анализ таймаута блокировки 1С

Получаем таблицу, по времени можно соотнести записи из первого и второго запроса. Это сведения о соединении, которое упало с ошибкой. Как правило это сообщение идет сразу же после сообщения о таймауте и имеет durationus близкое к 20с (20.000.000). 20с настраивается в конфигураторе на базу, это типовая настройка, ее менять не рекомендуется.

Конфликт блокировки при выполнении транзакции

Здесь помимо контекста получаем еще и сведения о планируемой блокировке — имена таблиц, полей блокировки и типе блокировке — разделяемая (shared) и исключительная (Exclusive).

Теперь поищем соединение, которое заблокировало ресурсы. Делаем отбор по номеру соединения (waitConnections из первого запроса), регион возьмем из второго запроса.

Конфликт блокировки при выполнении транзакции

При выполнении получаем контекст и время, когда была наложена блокировка. Надо искать блокировку, которая была наложена до возникновения таймаута.

Конфликт блокировки при выполнении транзакции

Имея данные по контексту можем проанализировать причину возникновения. В данном случае причина была в том, что эксклюзивная блокировка накладывалась по полю Fld3454, при этом жертва пыталась наложить разделяемую блокировку по полю Fld3457. В качестве решения было принято отказаться от получения данных из регистра через набор записей (разделяемая блокировка) в пользу работы через запрос.

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

Функционал по поиску таймаутов появился в недавней версии сервиса.