Взаимоблокировки 1С и способы их устранения
Взаимоблокировка в 1С — это неразрешимый конфликт двух блокировок данных. Конфликт заключается во взаимном ожидании двух и более пользователей на блокировке данных.
В системе иногда появляется сообщение «Транзакция вызвала взаимоблокировку ресурсов», что сигнализирует специалисту о наличии ошибок в системе.
Ниже мы подробнее рассмотрим, что такое взаимоблокировки и как их избежать.
Для решения данной проблемы взаимоблокировок «менеджер взаимоблокировок» находит спорные ситуации и откатывает наименее важную для СУБД транзакцию (по его мнению).
Возникновение таких исключительных ситуаций можно отследить с помощью Центра управления производительностью (ЦУП). В любой системе необходимо сведение таких ситуаций на нет.
Типичные причины взаимоблокировок СУБД в 1С 8.3
Установка недостаточного уровня блокировки ресурса
Одна из самых распространенных причин взаимоблокировок. Заключается в том, что две и более транзакции считывают данные в режиме разделяемой блокировки (S), а потом пытаются изменить эти данные. Но если на ресурс наложена S-блокировка в другой транзакции, естественно, во всех транзакциях ничего не получится, что и приводит к взаимоблокировкам.
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Решением является установка максимально необходимого уровня изоляции.
Для автоматического режима:
- при чтении набора записей обязательна установка конструкции «ДЛЯ ИЗМЕНЕНИЯ»;
- в объектной технике — перед чтением (ПолучитьОбъект()) объекта выполнить запрос и заблокировать данные «ДЛЯ ИЗМЕНЕНИЯ».
Захват ресурсов 1С в разном порядке
Возникновение данного типа взаимоблокировки возможно при блокировке нескольких разных ресурсов разными транзакциями в разной последовательности.
Пример:
Причиной взаимоблокировки в 1С может являться разный порядок захвата ресурсов.
Пример: имеем 2 документ, ПоступлениеТМЦ и РеализацияТМЦ. Допустим, документы делают движения по двум регистрам — «ОстаткиНаСкладах», «ОстаткиОрганизаций». В обработке проведения присутствуют следующие строки:
ПоступлениеТМЦ:
ОстаткиНаСкладах.Записать();
….
ОстаткиОрганизаций.Записать();
РеализацияТМЦ:
ОстаткиОрганизаций.Записать();
……
ОстаткиНаСкладах.Записать();
Т.е. ресурсы блокируются в явном виде в разном порядке. Если две транзакции совпадут по времени, получится, что ни один из документов не сможет выполнить второе действие — ресурсы будут заблокированы, что приведет к взаимоблокировке.
Решение — блокировка ресурсов в одном порядке. В случае, если сделать это очень трудоемко, имеет смысл установить блокировку в нужном порядке в коде процедуре явным способом.
Ошибка блокировок 1С при работе внутренних механизмов СУБД
Распараллеливание процессов
Очень часто администраторы встречаются с ошибкой «распараллеливания» процессов. СУБД на своём уровне может распределить выполнение действия на различные процессоры системы. В этом случае процессы на разных процессорах могут заблокировать ресурсы и тем самым вызвать взаимоблокировку. Типичным для данной проблемы являются следующие ошибки:
- Intra-query parallelism caused your server command to deadlock
- Transaction was deadlocked on thread communication buffer resources with another process and has been chosen as the deadlock victim
Решается данная проблема установкой параметра max degree of parallelism СУБД в значение «1» (по-умолчанию там «0»).
Построение плана запроса с избыточными блокировками
Также взаимоблокировки в 1С могут возникнуть по вине СУБД по следующей причине:
При построении сложного запроса СУБД может построить не оптимальный план запроса и тем самым заблокировать «лишние» ресурсы, что, в свою очередь, может привести к взаимоблокировке.
Обычно это происходит при следующих условиях:
- производится сканирование (table scan, index scan);
- присутствие конструкции «ДЛЯ ИЗМЕНЕНИЯ»;
- включен автоматический режим блокировок.
Для решения данных проблем, соответственно, необходимо:
- оптимизировать запрос в 1С, чтобы исключить сканирование таблиц;
- не злоупотреблять конструкцией «ДЛЯ ИЗМЕНЕНИЯ»;
- перевод конфигурации в управляемый режим блокировок.
Неоптимальные запросы
И последней типичной причиной возникновения взаимоблокировок являются неоптимальные запросы, которые могут вызывать избыточные блокировки и, как следствие, взаимоблокировку.
Подробнее об этом можно прочитать в статье — оптимизации запросов 1С.
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!