Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

MSSQL_ERROR_1222 1С:Предприятие и СУБД

MSSQL Error 1222: Lock request time out period exceeded — Таймаут блокировок

Обновлено: 25.08.2026 · Официальная документация ↗

Ошибка 1222 возникает, когда сессия запрашивает блокировку ресурса, удерживаемого другой транзакцией, и время ожидания превышает установленный лимит LOCK_TIMEOUT (в 1С по умолчанию 20–40 секунд).

  • Сообщение: Lock request time out period exceeded (Severity 16, State 45).
  • В 1С появляется окно: Превышено максимальное время ожидания предоставления блокировки.
  • Зависание сессий пользователей при попытке записать документ или провести регламентную операцию.
  • Накопление очереди заблокированных процессов в системных мониторах.

1. Мониторинг блокировок в реальном времени

SELECT 
    wt.session_id AS [Blocked_Session],
    wt.blocking_session_id AS [Blocking_Session],
    wt.wait_duration_ms,
    wt.wait_type,
    wt.resource_description,
    txt_blocked.text AS [Blocked_SQL],
    txt_blocking.text AS [Blocking_SQL]
FROM sys.dm_os_waiting_tasks wt
JOIN sys.dm_exec_requests req_blocked ON wt.session_id = req_blocked.session_id
OUTER APPLY sys.dm_exec_sql_text(req_blocked.sql_handle) txt_blocked
LEFT JOIN sys.dm_exec_requests req_blocking ON wt.blocking_session_id = req_blocking.session_id
OUTER APPLY sys.dm_exec_sql_text(req_blocking.sql_handle) txt_blocking
WHERE wt.blocking_session_id IS NOT NULL;

2. Определение корневого блокировщика (Lead Blocker)

WITH Blockers AS (
    SELECT 
        session_id, 
        blocking_session_id, 
        0 AS Level
    FROM sys.dm_exec_requests
    WHERE blocking_session_id = 0 AND session_id IN (SELECT blocking_session_id FROM sys.dm_exec_requests WHERE blocking_session_id != 0)
)
SELECT 
    s.session_id,
    s.login_name,
    s.host_name,
    s.program_name,
    t.text AS BlockerQuery
FROM Blockers b
JOIN sys.dm_exec_sessions s ON b.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(s.most_recent_sql_handle) t;

3. Принудительное прерывание зависшей блокирующей сессии

KILL 123; -- Укажите session_id корневого блокировщика

4. Оптимизация на стороне 1С:Предприятие

  • Сократите длительность транзакций: вынесите тяжелые вычисления, вызовы внешних веб-сервисов и печать форм за пределы транзакции (ЗафиксироватьТранзакцию()).
  • Проверьте актуальность статистик: устаревшая статистика приводит к сканированию всей таблицы (Table Scan) с удержанием блокировок на миллионах строк.
💡 Практика специалистов: Основная причина 1222 в 1С — выполнение интерактивных действий внутри открытой транзакции (например, модальное диалоговое окно подтверждения пользователем), из-за которого блокировка держится минутами.

Частые вопросы (FAQ)

В чем разница между Deadlock (1205) и Lock Timeout (1222)?

При Deadlock возникает круговое ожидание, которое система не может разрешить самостоятельно без сброса сессии. При Lock Timeout процесс просто ждет освобождения ресурса дольше разрешенного лимита времени.

Какое значение LOCK_TIMEOUT установлено в SQL Server по умолчанию?

По умолчанию в SQL Server таймаут равен -1 (бесконечное ожидание). Платформа 1С:Предприятие принудительно устанавливает SET LOCK_TIMEOUT перед выполнением транзакционных запросов.

Как эскалация блокировок (Lock Escalation) влияет на ошибку 1222?

Если транзакция изменяет более 5000 строк, SQL Server пытается эскалировать блокировки строк (RID/KEY) до уровня всей таблицы (TAB). Это моментально блокирует всех остальных пользователей.

Как запретить эскалацию блокировок на уровне конкретной таблицы?

Выполните: ALTER TABLE [Schema].[Table] SET (LOCK_ESCALATION = DISABLE);. Однако это может увеличить расход памяти пула блокировок (Lock Memory).

Полезные материалы
Рекомендуем