Конфликты блокировок и ошибки "Превышено время ожидания установки блокировки на ресурс" — частая проблема в высоконагруженных системах 1С, особенно в конфигурациях со старой архитектурой и автоматическим режимом управления блокировками. Давайте разберемся, как пошагово диагностировать такие ситуации, какие инструменты использовать и как найти корень проблемы, чтобы ее исправить.
Проанализируем ситуацию: у нас есть старая конфигурация, например, "Управление торговлей", работающая в режиме автоматических блокировок. Это означает, что сама платформа 1С решает, какие данные блокировать при выполнении запросов. Когда два или более пользователя одновременно пытаются изменить одни и те же данные (например, списать одну и ту же позицию товара), возникает конфликт. Одна транзакция ждет, пока другая освободит ресурс. Если ожидание затягивается, система прерывает его по таймауту.
Прежде чем погружаться в анализ кода и запросов, убедимся, что сама система управления базами данных (СУБД) работает оптимально. Часто проблемы с производительностью, которые приводят к долгим блокировкам, кроются именно здесь.
tempdb по разным физическим дискам. Это стандартная практика для повышения производительности дисковой подсистемы.Эти действия являются "гигиеническим минимумом" и могут решить проблему без глубокого анализа кода, если причина была в общей деградации производительности СУБД. Для автоматизированного контроля параметров и регламентных настроек базы данных подойдёт обработка для комплексного аудита СУБД под 1С.
Если обслуживание БД не помогло, пора переходить к детальному анализу. Нам нужно понять, какой именно код, какой запрос и на каких данных вызывает конфликт. Для этого есть несколько мощных инструментов.
Это основной и самый важный инструмент для разработчика 1С при анализе блокировок. Он позволяет увидеть проблему не на уровне абстрактных таблиц SQL, а в контексте конкретного кода 1С.
Настройте ТЖ на сбор следующих событий:
TLOCK — фиксирует конфликты блокировок с ожиданием.TDEADLOCK — фиксирует взаимные блокировки (deadlocks), когда две транзакции блокируют друг друга и не могут продолжаться.В логе ТЖ вы увидите:
Это самый точный способ связать проблему в СУБД с конкретным участком кода в конфигурации.
Иногда полезно посмотреть на ситуацию "глазами" СУБД, особенно в момент возникновения проблемы.
Extended Events — более современная и менее ресурсоемкая технология. Вы можете настроить сессию для отслеживания событий, связанных с блокировками, например, lock_deadlock или lock_timeout.sys.dm_tran_locks и sys.dm_os_waiting_tasks покажут детальную информацию о текущих блокировках и ожиданиях.blocked_process_report. Специализированный отчет в SQL Server, который генерируется при превышении порога ожидания блокировки. Он содержит подробную информацию о блокирующей и блокируемой транзакциях.Инструменты показали нам, ГДЕ возникает проблема. Теперь нужно понять, ПОЧЕМУ она возникает. Чаще всего причина кроется в высокой конкуренции за одни и те же ресурсы.
Проанализируем типичные сценарии:
Внимательно изучите код, который был найден с помощью ТЖ. Посмотрите на текст запроса, который фигурирует в ошибке. Постарайтесь понять, к каким данным он обращается и почему в этом месте может возникать конкуренция. Для быстрого перевода имен таблиц и полей из СУБД в понятные метаданные конфигурации можно использовать инструмент для трансляции SQL-запросов в термины 1С.
Если проблема носит системный характер, локальными исправлениями не обойтись. Необходимо принимать архитектурные решения.
Это самый правильный и эффективный, но и самый трудозатратный путь. В автоматическом режиме платформа сама решает, что блокировать, и часто "перестраховывается", блокируя целые страницы данных или таблицы (эскалация блокировок). Это просто, но неэффективно.
Режим управляемых блокировок передает полный контроль в руки разработчика. Вы можете явно указать в коде, какие именно данные и в каком режиме нужно заблокировать.
Например, вместо неявной блокировки при выполнении запроса, вы можете в начале транзакции установить управляемую блокировку на конкретные значения измерений регистра:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиТоваров");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Номенклатура", СсылкаНаТовар);
ЭлементБлокировки.УстановитьЗначение("Склад", СсылкаНаСклад);
Попытка
Блокировка.Заблокировать();
// ... здесь код проведения документа ...
Исключение
// ... обработка ошибки блокировки ...
КонецПопытки;
Это позволяет блокировать только те записи, которые действительно нужны, и на минимально возможное время, что кардинально снижает количество конфликтов.
Подведем итог. "Размотка" проблем с блокировками — это системная работа, которая включает в себя: