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

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

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

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

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

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

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

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

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

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

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

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

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

Получите 267 видеоуроков по 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С.

P.S. Наша компания предоставляет услуги по настройке, доработке и комплексному внедрению 1С. Закажите бесплатный расчет стоимости вашей задачи на странице Услуги 1С или по телефону +7 (499) 350 29 00.

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

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

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