Все проекты English Написать директору Вебинары
Импортозамещение
Выбор региона
Ваш город:Минск
Поиск

5 типичных причин, вызывающих взаимоблокировки в 1С

Время чтения: ~4 мин.

Актуальность проверена: 06 . 10 . 2024

Грамотная настройка СУБД позволяет избежать досадных зависаний в 1С. Особенно неприятно это явление в крупных компаниях, где одновременное обращение к необходимой информации разными сотрудниками может спровоцировать сразу несколько взаимоблокировок.

Как появляется взаимоблокировка в 1С

Состояние взаимоблокировки 1С вызывает такая работа СУБД, при которой 2 или несколько процессов попадают в режим ожидания отклика от ресурсов, занятых этими процессами. При неразрешимом конфликте двух и более пользователей базой данных появляется всплывающее «аварийное» сообщение с требованием запустить процесс заново (начинается словами «Транзакция {в скобках будет указан номер процесса} вызвала взаимоблокировку <…>»). Каверзность такого конфликта (не случайно названного неразрешимым) в том, что сессии не только взаимно блокируют друг друга, но и становятся во взаимное ожидание на снятие этой блокировки. ЦУП позволяет отследить появление незапланированных ситуаций в системе.

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

5 причин, вызывающих взаимоблокировки 1С и соответствующие им решения

1. Несоответствующий уровень блокировки ресурса

Проблема:
Если данный уровень недостаточен, синхронные транзакции приступают к скачиванию информации посредством разделяемой блокировки (S). Потом каждая из транзакций пытается изменить скачанные сведения. И когда одна из задействованных в процессе транзакций налагает S-блокировку на ресурс другой транзакции, все остальные перестают действовать.  

Решение:
Чтобы оптимизировать работу системы, следует изменить уровень изолированности до максимального (перейдя на управляемый режим) и по возможности минимизировать длительность операций. 

2. Захват ресурсов 1С в произвольной последовательности

Проблема:
При этом типе взаимоблокировки разные ресурсы блокируются разными транзакциями в произвольном порядке. Их количество может быть произвольным. Две транзакции проходят синхронно, и второе действие для документов оказывается вне доступа.

Пример: если документы 1 и 2 будут одновременно двигаться по регистрам 1 и 2 (но в разной последовательности), они заблокируют друг другу по строчке регистра и зависнут на ожидание.

Документ

Регистр

1. Ботинки мужские демисезонные

1. Реализовано (блокировка от документа 2, ожидание)

2. Возврат

2. Ботинки женские демисезонные

1. Реализовано

2. Возврат (блокировка от документа 1, ожидание)


Решение:
Чтобы справится с данной проблемой, необходимо блокировать все ресурсы в одной последовательности. Оптимальным способом решения этой задачи представляется установка блокировки в необходимом порядке непосредственно в коде. 

3. Ошибка блокировок 1С при действии внутренних механизмов СУБД

Проблема 1 (распараллеливание процессов):

Распараллеливание процессов возникает из-за того, что СУБД имеет возможность произвольно распределить выполнение любого действия на разные процессоры системы. Если процессы, происходящие на разных процессорах, блокируют ресурсы, то происходит  взаимоблокировка.  

Решение:
Избежать этого типа взаимоблокировки поможет заблаговременная проверка возможности предоставления ресурса. Параметр max degree of parallelism в СУБД по умолчанию настроен на цифру «0». Если выставить параметр на «1», то параллельность процессов будет оптимизирована.

Проблема 2 (построение плана запроса с избыточными блокировками):

Когда в систему вводится сложный запрос, СУБД может внести погрешность в план запроса, который заблокирует «лишние» ресурсы, в результате чего возникнет взаимоблокировка. СУБД составляет неоптимальный план запроса если:

  • производится сканирование (table skan, index skan)
  • в наличии опция «ДЛЯ ИЗМЕНЕНИЯ»
  • активирован авторежим всех блокировок.
Решение:
Избежать взаимоблокировок, возникающих из-за погрешности в плане запроса возможно, если реже пользоваться конструкцией «ДЛЯ ИЗМЕНЕНИЯ».Запрос в 1С следует составлять таким образом, чтобы сканирование таблиц было исключено. Наконец, можно всю конфигурацию 1С перевести с автоматических блокировок на управляемые. 

4. Неоптимальные запросы

Существуют случаи, при которых для возникновения взаимоблокировки достаточно некорректного запроса. Например, если для отбора в виртуальной таблице используется конструкция «ГДЕ». Фактически, при использовании этой конструкции система получает все записи, и только после выбирает нужные.

Поле «Регистратор» имеет такой тип данных, в котором содержатся все документы, способные писать данные в регистр. Пользоваться регистратором не стоит, потому что адресованный с его применением запрос обращается не к одной таблице, а сразу к 22. Для оптимизации процессов имеет смысл пожертвовать объёмом хранимых данных или же отказаться от универсальности кода.

Идентичные проблемы могут возникнуть при соединении нескольких виртуальных таблицы. По этой причине лучше создавать временную таблицу. Поскольку временные таблицы находятся в нескольких физических таблицах СУБД, необходимо создать индексы для соединяемых в запросе полей таблицы, а затем включить виртуальную таблицу во временную. 

5. Условия по неиндексируемым полям

Проблема:
СУБД замедляет исполнение запроса, если при его составлении использовать отбор по неиндексируемым полям. Эта ошибка часто встречается и при создании сложного запроса на базе временной таблицы.  

Решение:
Индексировать поля, включающие большое число значений. Каждому условию нужен подходящий индекс (обязательно составной), в начале которого указаны все перечисленные в условии поля. Судить о количестве полей, обслуживаемых готовым индексом, можно по числу латинских букв, следующих в конце индекса после нижнего подчеркивания (1буква=1 поле). 

Это важно: некоторые типы объектов имеют свои нюансы при составлении индексов.

Если индексы составлены некорректно, СУБД при запросе начнет сканирование всей таблицы. Срок исполнения запроса значительно снизится, что может спровоцировать блокировку набора записей.


Заключение

Вышеперечисленные проблемы и решения требуют определенного уровня знаний и опыта в разработке 1С. Неверные действия могут существенно увеличить количество ошибок и взаимоблокировок в 1С. Поэтому, если вы не обладаете соответствующей квалификацией и достаточными знаниями о транзакциях и блокировках, то лучше довериться профессионалам.

Остались вопросы? Закажите бесплатную консультацию наших специалистов!

Хотите получать подобные статьи по четвергам?
Быть в курсе изменений в законодательстве?
Подпишитесь на рассылку

Нет времени читать? Пришлем вам на почту!

Я даю Согласие на обработку персональных данных в соответствии с Политикой Конфиденциальности

Подскажем решение для вашей задачи

Заказать помощь ИТ-специалиста