Гайд 1С: Диагностика и устранение долгих блокировок LCK_M_X в SQL Server
В моменты пиковой нагрузки в системе фиксируются критические задержки:
- Массовое зависание пользователей с ошибкой
Превышено время ожидания предоставления блокировки. - В системных представлениях SQL Server фиксируются ожидания типа
LCK_M_X(Exclusive Lock) иLCK_M_IX(Intent Exclusive). - Появление длинных цепочек блокировок (Head Blocker), где один сеанс блокирует десятки остальных.
1. Поиск сеанса-источника блокировки (Head Blocker) через DMV
Выполните диагностический SQL-запрос для выявления корневого сеанса, удерживающего блокировку:
SELECT
r.session_id AS BlockedSession,
r.blocking_session_id AS HeadBlocker,
r.wait_type,
r.wait_time AS WaitTime_ms,
r.wait_resource,
t.text AS SQL_Text,
ib.text AS Blocker_SQL_Text
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_connections c ON r.session_id = c.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
LEFT JOIN sys.dm_exec_requests br ON r.blocking_session_id = br.session_id
LEFT JOIN sys.dm_exec_connections bc ON r.blocking_session_id = bc.session_id
OUTER APPLY sys.dm_exec_sql_text(bc.most_recent_sql_handle) ib
WHERE r.blocking_session_id <> 0;2. Сопоставление SPID SQL Server с сеансом 1С
В технологическом журнале 1С сопоставьте значение spid из SQL Server с контекстом встроенного языка через событие DBMSSQL:
<log location="/var/log/1c/logs/db_locks" history="12">
<event>
<eq property="name" value="DBMSSQL"/>
<ge property="Duration" value="5000000"/>
</event>
<property name="all"/>
</config>3. Устранение причин блокировок LCK_M_X
- Длительные транзакции: выносите вызовы веб-сервисов, проведение других документов и тяжелые расчеты за пределы транзакции (
ЗафиксироватьТранзакцию()). - Неявные сканирования таблиц: проверьте наличие покрывающих индексов по полям фильтрации в запросах модификации (
UPDATE/DELETE), чтобы исключить эскалацию блокировок строк до страниц и таблиц (Lock Escalation).
Частые вопросы (FAQ)
Что означает тип блокировки LCK_M_X?
LCK_M_X — это ожидание захвата эксклюзивной блокировки (Exclusive Lock). Оно возникает, когда транзакция пытается изменить (INSERT, UPDATE, DELETE) ресурс, который в этот момент уже читается или модифицируется другой транзакцией.
Как влияет режим Read Committed Snapshot Isolation (RCSI) на блокировки LCK_M_X?
RCSI устраняет конфликты между чтением и записью (читатели не блокируют писателей, писатели не блокируют читателей), но не устраняет блокировки между двумя параллельными операциями записи в одну строку.
Как принудительно отключить эскалацию блокировок для конкретной таблицы 1С?
В SQL Server можно выполнить команду ALTER TABLE _InfoRg12345 SET (LOCK_ESCALATION = DISABLE); однако для 1С это крайняя мера, правильнее оптимизировать запросы и транзакции.
Почему время ожидания на блокировке 1С по умолчанию равно 20 секундам?
Это системный тайм-аут ожидания блокировки данных в платформе 1С. Если за 20 секунд ресурс не освобожден, транзакция прерывается с генерацией исключения.