Взаимоблокировки в крупных базах данных — это классическая проблема производительности, которая часто обостряется при высокой конкуренции сеансов. Когда множество пользователей одновременно пытаются записать данные в один и тот же регистр, SQL-сервер вынужден выстраивать очередь. Если транзакции при этом пересекаются, возникают дедлоки. Давайте разберем, как подойти к решению этой задачи системно, не прибегая к опасным архитектурным экспериментам.
Идея вынести проведение документов в отдельный сеанс через «Очередь проведения» кажется заманчивой, но она несет серьезные риски для бизнеса:
Таким образом, использование очереди — это лишь «костыль», который маскирует симптомы, но не лечит болезнь. Наша задача — найти истинную причину конфликтов.
Первым делом мы должны увидеть, какой именно программный код «держит» блокировку дольше всех. Единственный достоверный инструмент для этого в 1С — Технологический журнал. SQL-сервер сам по себе может быть лишь жертвой, а причина всегда кроется в логике транзакций 1С.
Настроим сбор данных для фиксации событий tdeadlock и tlock. Создадим конфигурационный файл logcfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<dump create="false"/>
<log location="C:\TechLogs\" history="1">
<event>
<eq property="name" value="tdeadlock"/>
</event>
<event>
<eq property="name" value="tlock"/>
</event>
<property name="all">
<event>
<eq property="name" value="tdeadlock"/>
</event>
<event>
<eq property="name" value="tlock"/>
</event>
</property>
</log>
</config>
Разберем, что мы ищем: события TLOCK, длительность которых превышает 1-2 секунды, укажут на «тяжелые» транзакции. Сопоставив время возникновения события с журналом регистрации 1С, мы вычислим конкретный документ или обработку, которая блокирует регистр ТоварыКПередаче.
После того как мы выяснили, какой участок кода вызывает блокировки, применим следующие методы оптимизации:
НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Все тяжелые вычисления, запросы к внешним источникам и проверку прав доступа выполняйте до открытия транзакции записи.UPDATE STATISTICS и выполните перестроение индексов. Фрагментация индексов — частая причина того, что SQL-сервер блокирует целые страницы данных вместо конкретных записей.READ_COMMITTED_SNAPSHOT. Это позволяет считывать данные без блокировок, что критически важно для работы 1С в режиме высокой конкуренции.В ходе обсуждения часто упоминается очистка папок scntx или файлов srvinfo. Хотя это не влияет на логику блокировок в БД напрямую, очистка кэша сеансов сервера 1С помогает при «зависаниях» и необъяснимых ошибках взаимодействия клиент-сервер. Если у пользователей возникают странные ошибки, попробуйте остановить службу 1С и очистить временные файлы кластера — это стандартная гигиеническая процедура для крупных систем.
Итого: не спешите переписывать архитектуру под очередь проведения. Сначала соберите логи через технологический журнал, найдите «виновника» — конкретную транзакцию, и оптимизируйте именно её алгоритм записи. Чаще всего проблема решается либо сокращением длительности транзакции, либо обновлением статистики и индексов на уровне SQL-сервера.