Взаимоблокировки в 1С
Меню

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

Содержание статьи
  1. Как появляются взаимоблокировки в 1С
  2. Как бороться со взаимными блокировками?

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

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

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

  1. Установка высшего уровня изоляции данных для последующего изменения. Суть проблемы состоит в том, что 2 или больше сессий захватили 1 ресурс и, установив разделяемую блокировку, считали данные. Затем каждый из сеансов должен был изменить считанные данные, но не смог, так как их изменение было заблокировано другой сессией. В результате 2 пользователя находятся в режиме ожидания друг друга, то есть получается взаимоблокировка;
  2. Второй частой причиной появления подобных проблем является захват определенных ресурсов в разном порядке в коде. Например, в документах – «Приобретение товаров» и «Реализация товаров», которые записывают информацию в регистры «Себестоимость товаров» и «Остатки товаров», вероятность увидеть взаимоблокировку существенно увеличивается, если в коде задать разную последовательность блокировки и записи в регистры. При одновременном проведении документов они взаимно заблокируют по 1 регистру и будут ждать, пока освободится другой;

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

Используя технологический журнал, взаимоблокировки можно отследить и установить, какие действия пользователей или фоновых заданий их вызывают. Найти их можно по специальному событию – “TDEADLOCK”. Вместе с наименованием, журнал дает нам следующую важную информацию:

  • Пользователь – параметр “usr”;
  • Параметр “DeadlockConnectionIntersections” объединяет в себе следующую информацию:
    • Первые 4 цифры и следующие 4 цифры – соединение, ожидающее блокировку, и установившее, соответственно;
    • Имя таблицы заблокированного ресурса. По этому имени можно найти данные в структуре базы данных;
    • Тип блокировки – Исключительная;
    • Имя поля таблицы в обозначении базы данных.

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

Как бороться со взаимными блокировками?

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

  • При чтении данных с последующей записью желательно сразу же блокировать их в исключительном режиме. Этим вы предотвратите ситуацию с одновременным чтением пользователей информации, которая потом будет изменяться в их транзакциях;
  • Заранее задать очередь для захвата данных и повсеместно использовать ее в процедурах конфигурации. Этим правилом разрешаются многие серьезные взаимные блокировки даже в типовых конфигурациях 1С;
  • Оптимизация запросов;
  • Снижение времени одной транзакции и общей длительности процедур. Вместе с этим нужно тщательно оценить количество используемых объектов и попытаться его уменьшить. Также можно заменить чтение данных по ссылке путем получения объекта на запрос со всей необходимой информацией;
  • Перед тем, как заблокировать новые данные – снимите блокировку с предыдущих. В этом поможет разбиение длительных транзакций на несколько более мелких. Отличный вариант для многопользовательских высоконагруженных систем;
  • Также можно посоветовать для данных, которые слишком «популярны» в конфигурации, установить расписание, когда они уже захвачены. Например, в определенное время (ночью) с документами работают фоновые задания, а днем пользователи регистрируют операции в базе 1С.

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

Рассказать друзьям
Предыдущая статья статья
Выпуск продукции в 1С 8.3 Бухгалтерии
Следующая статья статья
Основные справочники 1С 8.3: создание и изменение элементов
Комментарии