При администрировании высоконагруженных информационных баз 1С часто возникает задача мониторинга конкуренции за ресурсы. Нередко разработчики и администраторы ищут события наложения и снятия блокировок (по аналогии с Lock:Acquired и Lock:Released в MS SQL Server), чтобы вычислять длительность удержания ресурсов. Разберем, как устроен механизм логирования управляемых транзакционных блокировок в платформе 1С:Предприятие и как правильно настраивать технологический журнал для выявления задержек пользователей на блокировках без риска перегрузить рабочую систему.
Проанализируем архитектуру управляемых блокировок в 1С. В отличие от пессимистических объектных блокировок, управляемые транзакционные блокировки подчиняются следующим правилам:
ЗафиксироватьТранзакцию) или отката (ОтменитьТранзакцию). Отдельного снятия блокировки с конкретной записи или таблицы до окончания транзакции не существует.Для сбора информации об ожиданиях нет необходимости вычислять дельту между установкой и снятием блокировки или искусственно занижать максимальное время ожидания (таймаут по умолчанию составляет 20 секунд). Платформа 1С фиксирует эти данные автоматически в событии TLOCK.
Рассмотрим ключевые особенности свойства Duration в событии TLOCK:
TLOCK параметр Duration отражает не время удержания блокировки, а время ожидания освобождения ресурса текущим сеансом (в микросекундах).Duration равен нулю или минимален, а свойство WaitConnections остается пустым.TLOCK, где Duration покажет точное время простоя в очереди, а в WaitConnections будет указан номер сеанса-виновника.TLOCK генерируется событие TTIMEOUT. В случае взаимной блокировки двух и более сеансов формируется событие TDEADLOCK.Чтобы собирать только проблемные ситуации и не забивать дисковое пространство миллионами записей о мгновенных захватах блокировок, настроим технологический журнал с фильтром по времени ожидания или наличию конкурирующих соединений.
Посмотрим на пример конфигурационного файла logcfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\LOGS\TLOCK_WAIT" history="72">
<event>
<eq property="name" value="TLOCK"/>
<gt property="duration" value="1000000"/>
</event>
<event>
<eq property="name" value="TTIMEOUT"/>
</event>
<event>
<eq property="name" value="TDEADLOCK"/>
</event>
<property name="all"/>
</log>
</config>
Разберем параметры этой настройки:
<gt property="duration" value="1000000"/> отбирает только те события TLOCK, в которых пользователь ждал освобождения блокировки более 1 секунды (1 000 000 мкс).<ne property="WaitConnections" value=""/>, чтобы фиксировать абсолютно все случаи ожидания независимо от их длительности.Выясним причину долгого ожидания по шагам, используя полученный лог:
TLOCK или TTIMEOUT определяем номер блокирующего сеанса в свойстве WaitConnections, а также пространство блокировки в свойстве Regions и заблокированные поля в свойстве Locks.CALL, SCALL и запросов SDBL или DBMSSQL/DBPOSTGRS.Записать()) и выносим некритичные операции за пределы транзакционного блока.