Дедлоки в 1С: устранение ошибки «Превышено время ожидания блокировки»
Как выглядит ошибка взаимоблокировки (Дедлока)?
В момент пиковой нагрузки (например, в конце рабочего дня, когда склад отгружает накладные, а кассиры бьют чеки) у пользователей начинает вращаться колесо загрузки. Через 20–60 секунд ожидания 1С аварийно прерывает операцию с системной ошибкой: «Превышено максимальное время ожидания предоставления блокировки» или «Конфликт блокировок при выполнении транзакции: Взаимоблокировка (Deadlock)».
Схема классической взаимоблокировки (Deadlock)
| Шаг | Транзакция 1 (Менеджер Петров) | Транзакция 2 (Кладовщик Иванов) |
|---|---|---|
| 1 | Заблокировал Склад №1 (ждет Склад №2) | Заблокировал Склад №2 (ждет Склад №1) |
| 2 | Пытается получить доступ к Складу №2... (ЖДЕТ) | Пытается получить доступ к Складу №1... (ЖДЕТ) |
| 3 | ТУПИК (Взаимная блокировка). СУБД принудительно убивает одну из транзакций по тайм-ауту. | |
Первая помощь: быстрое освобождение базы
- Определите заблокированный сеанс: откройте консоль кластера серверов 1С или встроенную обработку «Активные пользователи».
- Найдите сеанс, который выполняет долгую транзакцию (время захвата блокировки более 60 секунд) и завершите его.
Системное решение проблемы дедлоков
- Включите управляемый режим блокировок: убедитесь, что в свойствах конфигурации режим управления блокировкой данных установлен в
«Управляемый»(Managed Lock). - Настройте технологический журнал (ТЖ): создайте файл
logcfg.xmlв папкеC:\Program Files\1cv8\conf\для сбора событийTLOCKSиTDEADLOCK:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\1C_Logs\Deadlocks" history="24">
<event>
<eq property="name" value="TDEADLOCK"/>
</event>
<event>
<eq property="name" value="TLOCK"/>
<ge property="WaitConnections" value="1"/>
</event>
<property name="all"/>
</log>
</config>Главное правило для программистов 1С: Блокировки ресурсов в коде должны захватываться строго в одинаковом алфавитном/хронологическом порядке во всех процедурах проведения документов!
Частые вопросы (FAQ)
Почему дедлоки не возникают в файловой базе?
В файловой базе при проведении любого документа блокируется вся таблица целиком на монопольном уровне, поэтому база просто ждет очереди, но работает крайне медленно.
Какое стандартное время ожидания блокировки в 1С?
По умолчанию время ожидания блокировки в платформе составляет 20 секунд. Если за это время ресурс не освободился, операция прерывается с ошибкой.
Поможет ли увеличение мощности процессора сервера?
Увеличение мощности сервера лишь ускорит выполнение транзакций, уменьшив окно возникновения тупика, но архитектурную ошибку неоптимального кода запросов это не исправит.
Как влияет фоновое регламентное задание на блокировки?
Тяжелые фоновые задания (например, пересчет итогов или полнотекстовая индексация), запущенные днем, часто захватывают регистры и вызывают массовые блокировки менеджеров.