Имя: Пароль:
1C
1С v8
Взаимоблокировка при параллельном выполнении задач
,
0 D_E_S_131
 
16.10.20
15:56
Имеется некий бизнес процесс, связанный с документом "Реализация товаров и услуг" (УТ 10.3).
Пытаюсь обработать задачи бизнес процессов, распараллеливая обработку через фоновые задания.
В процессе фоновые задания завершаются с ошибкой "Конфликт блокировок".
У "Бизнес процесса" и у "Задач" режим управления блокировкой "Управляемы" (в конфигурации "Автоматический и управляемый").
Платформа 8.3.15 (режим совместимости 8.2.16). MS SQL сервер 2017.
Что показывает профайлер:
https://hostingkartinok.com/show-image.php?id=1f46f3479bccf3c59b9f3f355c2e55f8

Индекс "ByProcPointExec" состоит из полей "Выполнена"+"Бизнес процесс"+"Точка маршрута"+"Ссылка".

Проблема блокировки возникает только при вызове метода задачи "Выполнить()". Если просто записывать реквизиты задачи, то обработка параллельно выполняется без ошибок.

Неужели текущая платформа не поддерживает параллельное выполнение задач разных бизнес процессов?
1 D_E_S_131
 
17.10.20
13:15
Придется пока остановиться на варианте заполнения реквизитов задач параллельно, а выполнение некоторых по заполненным реквизитам, последовательно. :(
2 Жан Пердежон
 
17.10.20
14:32
слишком мало данных - хз, что у тебя за фоновые задания,
возможно они одни и те же бп/задачи исполняют
3 mistеr
 
17.10.20
14:42
(0) Блокировка одних и тех же данных в разном порядке. Классика.
4 mistеr
 
17.10.20
14:45
(0) Что за Выполнить()? Может ВыполнитьЗадачу()?
5 zaki
 
17.10.20
16:09
(0) >Неужели текущая платформа не поддерживает параллельное выполнение задач разных бизнес процессов?
поддерживает в режиме конфигурации "Управляемый" и использованием в коде "Новый БлокировкаДанных"
в режиме "Автоматический и управляемый" если хоть один из объектов в транзакции будет в режиме "Автоматический" то все остальное тоже станет на автоматическим блокировки за счет SQL
6 D_E_S_131
 
18.10.20
13:32
(3) Невыполненные задачи выбираются запросом. Специально проверил, ни по одному бизнес-процессу нет более чем одной задачи. Перед изменением данные блокируются. Были бы одни и те же данные, то они бы и реквизиты записать не смогли. И да, "ВыполнитьЗадачу()", ошибся. Ноже сама процедура, где вносятся изменения

Процедура ОбработатьМассивЗадачКонтроляОплаты(ПакетЗадач, стрПакетЗадач = "") Экспорт

    ДнейАлерт = Константы.ксбПредупреждатьДоДнейОплаты.Получить();
    
    ТЗ = Новый ТаблицаЗначений;
    
    ТЗ.Колонки.Добавить("ЗадачаСсылка");
    
    Для каждого ТекЗадача Из ПакетЗадач Цикл
        
        НовСтр = ТЗ.Добавить();
        
        НовСтр.ЗадачаСсылка = ТекЗадача.Ключ;
        
    КонецЦикла;
    
    // МассивЗадач - массив соответствий, где ключ "ЗадачаСсылка", а значение "ТочкаМаршрута"
    Для каждого ТекЗадача Из ПакетЗадач Цикл
    
        ЗадачаСсылка = ТекЗадача.Ключ;
        
        НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
        
        Блокировка = Новый БлокировкаДанных;
        
        ЭлементБлокировки = Блокировка.Добавить("Задача.ксбЗадачиКонтроляОплаты");
        
        ЭлементБлокировки.УстановитьЗначение("Ссылка", ЗадачаСсылка);
        
        Попытка
            Блокировка.Заблокировать();
        Исключение
            
            ЗаписьЖурналаРегистрации("Контроль оплаты (КСБ)", УровеньЖурналаРегистрации.Ошибка, Метаданные.Задачи.ксбЗадачиКонтроляОплаты, ЗадачаСсылка, "Ошибка блокировки пакета задач " + стрПакетЗадач);
            
            Возврат;
        КонецПопытки;
        
        ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект();
        
        ксбУправлениеТорговымПроцессом.ЗаполнитьРеквизитыЗадачиКонтроляОплаты(ЗадачаОбъект);
        
        Если ЗадачаОбъект.ПросроченныйДолг > 0 Тогда
        
            ЗадачаОбъект.ВыполнитьЗадачу();// просто переходим к следующему этапу
            
        ИначеЕсли ТекЗадача.Значение = БизнесПроцессы.ксбКонтрольОплаты.ТочкиМаршрута.ИмеетсяДолг
            И ЗадачаОбъект.ДнейДоОплаты <= ДнейАлерт Тогда
        
            ЗадачаОбъект.ВыполнитьЗадачу();
        
        КонецЕсли;
        
        //ЗадачаОбъект.Записать();
        
        ЗафиксироватьТранзакцию();
        
    КонецЦикла;

КонецПроцедуры
7 D_E_S_131
 
18.10.20
13:34
(5) Вот у меня тоже подозрение, что при выполнении задачи изменяется какой-то объект, который не управляется ни через "БизнесПроцесс", ни через "Задачи".
8 Фрэнки
 
18.10.20
13:44
УТ 10.3 в режиме совместимости - какой там у вас в конфигурации установили, может его поднять повыше нужно, чтоб работало как ожидается?
9 D_E_S_131
 
18.10.20
14:09
(8) 8.2.16 там (обновление от прошлого месяца, конфигурация почти не измененная типовая). Тоже подозреваю, что это может влиять. Попробую на чистой базе с 8.3.15 версией сымитировать параллельное выполнение задач.
10 rphosts
 
18.10.20
14:14
(3) не обязательно, так-же бывает повышение уровня изоляции внутри транзакции
11 D_E_S_131
 
18.10.20
18:50
Проверил на режим совместимости - не влияет. Посмотрел на трассировку того, что происходит при методе "ВыполнитьЗадачу" и теперь есть подозрение, что выполнение одной задачи приводит к старту новой задачи, а это делает INSERT в таблицу задач. При определенном количестве добавленных строк видимо начинает блокироваться вся таблица. Может такое быть?
12 D_E_S_131
 
18.10.20
18:52
Точнее даже не таблица, а вот этот индекс №6  "ByProcPointExec" хочет перестроиться и попытка перестроить его в нескольких разных потоках приводит к блокировке.
13 Сияющий в темноте
 
18.10.20
18:59
нормальный скуль при перестроении индекса никого не блокирует.
14 D_E_S_131
 
18.10.20
19:01
(13) Возможно. Вообще основная проблема, что вижу блокировку в профайлере, но не понимаю, что профайлер мне хочет сказать. :)
15 D_E_S_131
 
18.10.20
19:11
Похоже что тематика вопроса лежит где-то тут https://docs.microsoft.com/ru-ru/previous-versions/sql/sql-server-2008-r2/ms191272(v=sql.105)?redirectedfrom=MSDN. Но вот можно ли с этим что-то сделать или "смирись, это на уровне платформы 1С"? :(
16 Жан Пердежон
 
19.10.20
11:28
ты так и не показал как у тебя ПакетЗадач формируется
17 D_E_S_131
 
19.10.20
12:54
(16) Задачи уже сформированы. Процедура регл.задания выбирает невыполненные задачи и выборкой делит их на пакеты и просто передает на выполнение. Саму процедуру заполнения реквизитов и выполнение задач (по условиям) я выложил. Или что Вы имеете в виду под "ПакетомЗадач"?