Мониторинг и устранение взаимных блокировок (Deadlocks) 1С в Extended Events
- Пользователи 1С получают ошибку «Взаимная блокировка (Deadlock) при выполнении транзакции».
- Код ошибки СУБД
Error 1205: Transaction was deadlocked on lock resources with another process and has been chosen as the deadlock victim. - События
TDEADLOCKв технологическом журнале платформы 1С.
1. Создание сессии Extended Events в MS SQL Server
Запустите SQL-скрипт для непрерывного перехвата XML-графов дедлоков:
CREATE EVENT SESSION [Capture_Deadlocks_1C] ON SERVER
ADD EVENT sqlserver.xml_deadlock_report
ADD TARGET package0.event_file(
SET filename=N'C:\SQL_Traces\Deadlocks_1C.xel',
max_file_size=(50),
max_rollover_files=(10)
)
WITH (STARTUP_STATE=ON);
GO
ALTER EVENT SESSION [Capture_Deadlocks_1C] ON SERVER STATE = START;
GO2. Настройка технологического журнала 1С для сопоставления контекста
Добавьте секцию в logcfg.xml:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\1C_Logs\Deadlocks" history="168">
<event>
<eq property="name" value="TDEADLOCK"/>
</event>
<event>
<eq property="name" value="TLOCKS"/>
<eq property="WaitConnections" value="0"/>
</event>
<property name="all"/>
</log>
</config>3. Анализ графа дедлока
Откройте файл .xel в SSMS. В графе определите:
- Жертву дедлока (Victim Process);
- Ресурсы (Key Lock, Page Lock, Table Lock), на которых возник цикл ожидания;
- Порядок захвата объектов: например, Транзакция 1 блокирует Таблицу А и ждет Таблицу Б, а Транзакция 2 блокирует Б и ждет А.
4. Устранение причин дедлока в коде 1С
Обеспечьте единый порядок блокировки объектов метаданных во всех транзакциях конфигурации (например, всегда сортируйте строки табличной части по номенклатуре перед проведением):
ТабличнаяЧасть.Сортировать("Номенклатура Возр"); Частые вопросы (FAQ)
Почему возникает Deadlock в 1С?
Взаимная блокировка возникает, когда две транзакции одновременно пытаются захватить одни и те же ресурсы (таблицы, строки индексов) в разном хронологическом порядке.
Как по имени таблицы в графе дедлока (например, _AccumRg12345) найти объект в 1С?
Используйте функцию 1С: ПолучитьСтруктуруХраненияБазыДанных() или выполните поиск имени таблицы через специальные обработки/скрипты сопоставления метаданных.
Как платформа 1С выбирает жертву дедлока?
Жертву выбирает не 1С, а СУБД (MS SQL Server / PostgreSQL) на основе стоимости отката транзакции (убивается транзакция, выполнившая меньший объем записей в лог).
Помогает ли управляемый режим блокировок полностью избавиться от дедлоков?
Управляемый режим минимизирует дедлоки на уровне СУБД, перенося управление на менеджер блокировок 1С, но при нарушении порядка захвата ресурсов в коде взаимоблокировки все равно возможны.