Мы на Workspace
Наверх
Gendalf Gendalf
2896

Взаимоблокировки «1С». От причины к решению

1С

«Что такое «взаимоблокировка «1С»? Сложно ответить на вопрос, не проведя аналогию. Возьмем в пример транспортные пробки. Представьте, что длинная пробка по одной из улиц перекрыла движение на перекрестке. Из-за этого перекресток взаимозаблокируется со всех сторон.

Так же и в системе «1С» - неразрешимый конфликт двух блокировок данных.

Как происходят взаимоблокировки в «1С»?

Приведем пример схематически:

Схема

Можно заметить, что один из документов уже заблокировал регистр «Взаиморасчеты с контрагентами» и хочет заблокировать регистр «Партии товаров на складах». А другой уже заблокировал регистр «Партии товаров на складах» и хочет заблокировать регистр «Взаиморасчеты с контрагентами». Происходит взаимное ожидание освобождения ресурсов.

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

Подобные моменты сопровождаются сообщением «Транзакция вызвала взаимоблокировку ресурсов» и свидетельствуют о наличии ошибки в «1С».

Причины взаимоблокировок «1С»

На рисунке выше указана лишь одна из причин взаимоблокировки в «1С». Она связана с захватом ресурсов в разной последовательности. Но, как показала практика, есть и другие причины.

Низкий уровень изоляции блокировки ресурса.

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

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

Взаимоблокировки «1С» в работе механизмов СУБД

Взаимоблокировка может возникнуть при построение неподходящего или неправильного запроса СУБД. Система управления базы данных формирует неоптимальный план запроса и блокирует «не нужные» ресурсы.

Одними из основных причин взаимоблокировок являются:

  • Явная запись наборов движений документа (пример: Движения.Товары.Записать()) вместо использования «Записывать = Истина» (пример: Движения.Товары.Записывать = Истина).
  • Последовательное чтение и далее запись тех же данных в транзакции.

Чтобы решить подобные проблемы, вам необходимо:

  • Использовать параметр «Записывать = Истина» при записи движений.
  • Данные, которые планируется изменять, захватывать сразу с необходимым уровнем изоляции (например, с помощью конструкции «Для изменения» в автоматическом режиме блокировок или с использованием управляемых блокировок в управляемом режиме).

Наличие неоптимальных запросов

Неоптимальные запросы играют важную роль в появлении взаимоблокировок «1С». И возникают они по разным причинам. Рассмотрим некоторые.

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

Все перечисленные причины увеличивают количество блокировок данных «1С» и замедляют работу пользователей. В конечном итоге, требуется оптимизация системы.

У вас возникли вопросы по причинам взаимоблокировок и оптимизации «1С»? Проконсультируйтесь бесплатно у экспертов, заполнив форму на сайте.

Поделиться  

Рейтинг статьи:

4.9

(на основе 11 голосов)