Закажите бесплатный расчет стоимости вашей задачи по 1С!
Перезвоним за 10 минут! (в рабочие часы)

Взаимоблокировки 1С и способы их устранения

Взаимоблокировка в 1С — это неразрешимый конфликт двух блокировок данных. Конфликт заключается во взаимном ожидании двух и более пользователей на блокировке данных.

В системе иногда появляется сообщение «Транзакция вызвала взаимоблокировку ресурсов», что сигнализирует специалисту о наличии ошибок в системе.

Ниже мы подробнее рассмотрим, что такое взаимоблокировки и как их избежать.

Взаимоблокировка

Для решения данной проблемы взаимоблокировок «менеджер взаимоблокировок» находит спорные ситуации и откатывает наименее важную для СУБД транзакцию (по его мнению).

Возникновение таких исключительных ситуаций можно отследить с помощью Центра управления производительностью (ЦУП). В любой системе необходимо сведение таких ситуаций на нет.

Типичные причины взаимоблокировок СУБД в 1С 8.3

Установка недостаточного уровня блокировки ресурса

Одна из самых распространенных причин взаимоблокировок. Заключается в том, что две и более транзакции считывают данные в режиме разделяемой блокировки (S), а потом пытаются изменить эти данные. Но если на ресурс наложена S-блокировка в другой транзакции, естественно, во всех транзакциях ничего не получится, что и приводит к взаимоблокировкам.

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

Решением является установка максимально необходимого уровня изоляции.

Для автоматического режима:

  • при чтении набора записей обязательна установка конструкции «ДЛЯ ИЗМЕНЕНИЯ»;
  • в объектной технике — перед чтением (ПолучитьОбъект()) объекта выполнить запрос и заблокировать данные «ДЛЯ ИЗМЕНЕНИЯ».
Для управляемого режима блокировок необходима установка исключительной блокировки (X) вместо разделяемой (S).

Захват ресурсов 1С в разном порядке

Возникновение данного типа взаимоблокировки возможно при блокировке нескольких разных ресурсов разными транзакциями в разной последовательности.

Пример:

Пример дедлока в 1С 8.3

Причиной взаимоблокировки в 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С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Остались вопросы?

СПРОСИТЕ в комментариях!

Добавить комментарий:

Ваш адрес email не будет опубликован.