Осторожно, управляемые блокировки.

Данная статья относится к релизу платформы 8.2.13.219 и наверное более ранним.

Начну с технических параметров. Платформа 8.2.13.219, конфигурация «Типовая Торговля для РБ 2.0» очень доработанная, одновременно работающих пользователей 130-140, свойство конфигурации «Режим управления блокировкой» —  «Автоматический».

При интенсивном вводе документов стали часто возникать взаимоблокировки. С помощью ЦУП были выявлены участки кода, где происходило большинство блокировок. Код и запросы максимально были оптимизированы, но блокировки все равно остались. После этого было решено частично перевести основные документы на работу в управляемых блокировках.

В свойство конфигурации «Режим управления блокировкой» было установлено «Автоматический и управляемый», все регистры, подчиненные регистратору, были переведены в управляемый режим. В модулях где в запросах использовалась конструкция «ДЛЯ ИЗМЕНЕНИЯ» использовался объект конфигурации «БлокировкаДанных».

В модулях часто использовалась конструкция для блокировок, где одновременно встречались методы «УстановитьЗначение» и «ИспользоватьИзИсточника»

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки = Блокировка.Добавить(«РегистрНакопления.ТоварыНаСкладах»);
ЭлементБлокировки.УстановитьЗначение(«Качество», Справочники.Качество.НайтиПоКоду(«1»));
ЭлементБлокировки.ИсточникДанных = Товары;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
Блокировка.Заблокировать();

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

Как только изменения были применены к рабочей базе (релиз платформы 8.2.13.219), то аварийное завершение менеджера кластера прекратилось.

Популярность: 14%

Запись опубликована в рубрике Настройка и оптимизация с метками , . Добавьте в закладки постоянную ссылку.

2 комментария на «Осторожно, управляемые блокировки.»

  1. Dmitriy говорит:

    Добрый вечер, внимательно ознакомился с вашей статьей, у нас такая проблема возникла(используем УПП 1.2, платформа 8.2.15), при одновременном проведении таких документов как Перемещение Товаров, Реализация Товаров Услуг, Возврат Товаров от Покупателя возникают взаимоблокировки, поэтому приняли решение перевести эти документы и связанные с ними регистры в управляемый режим блокировок. Сказано, надо делать, в ОбработкуПроведения() добавил такой вот код:
    /////////////////////////////////////////////////////////////////////////
    Пока Истина Цикл
    НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
    Попытка
    Блокировка= Новый БлокировкаДанных;
    ЭлементБлокировки=Блокировка.Добавить(«Документы.ВозвратТоваровОтПокупателя»);
    ЭлементБлокировки.Режим=РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных=Документы.ВозвратТоваровОтПокупателя;
    Блокировка.Заблокировать();
    -код процедуры
    Исключение // сообщим об ошибке
    стрОписаниеОшибки = ОписаниеОшибки();
    ОтменитьТранзакцию();
    Сообщить(«Ошибка блокировки» + ОписаниеОшибки());
    Прервать;
    КонецПопытки;
    ЗафиксироватьТранзакцию();
    КонецЦикла;
    /////////////////////////////////////////////////////////////////////
    пример был взят из синтаксис помощника конфигурации. Потом при более детальном разборе конфигурации обнаружил в общих модулях свой встроенный код накладывающий режим управляемой блокировки :
    ОбщегоНазначения.УстановитьУправляемуюБлокировку(СтруктураПараметровБлокировки,,СтруктураИсточникаДанных, Отказ, Заголовок);
    Что можете посоветовать,что лучше использовать?

    • Сергей Сопелев говорит:

      1. В обработке проведения не надо начинать транзакцию, т.к.при проведении открывается неявная транзакция. Если у документа свойство управления блокировками «Управляемый», то это будет управляемая транзакция. Конструкция «Попытка-исключение» я думаю лишняя.
      2. Не понятно зачем устанавливается блокировка на документ. Взаимоблокировок между документами не будет. Устанавливать надо на регистры.
      3. Как писать или в модуле или с помощью общей процедуры, это уже как удобней.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *