Многопоточная запись и проведение документов в пустуой базе
Всем привет, ситуация следующая: пишу в несколько потоков документы ввода остатков в пустую базу, код запуска заданий:
текст процедуры ВводОстатков:
Проблема в следующем: при первом запуске все документы записываются в базу, но не все проводятся из-за неустранимого конфликат блокировок, при всех последующих запусках все документы проводятся, никаких конфликтов нет, из-за чего это может быть?
UPD.
Разделение итогов по регистру, на котором происходит конфликт блокировок, включено.
Задания = Новый Массив;
АдресаРезультатов = Новый Массив;
Для Каждого КлючИЗначение Из СкладыПоПотокам Цикл
Ключ = Новый УникальныйИдентификатор;
АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, Ключ);
АдресаРезультатов.Добавить(АдресРезультата);
Параметры = Новый Массив;
Параметры.Добавить(Товары);
Параметры.Добавить(КлючИЗначение.Значение);
Параметры.Добавить(Организация);
Параметры.Добавить(ДатаЗаписиОстатков);
Параметры.Добавить(АдресРезультата);
Задание = ФоновыеЗадания.Выполнить("НагрузочноеТестированиеСервер.СоздатьВводОстатков", Параметры);
Задания.Добавить(Задание);
КонецЦикла;
Показатьтекст процедуры ВводОстатков:
Процедура СоздатьВводОстатков(Знач Товары, Знач Склады, Знач Организация, Знач ДатаЗаписиОстатков, Знач АдресРезультата) Экспорт
Массив = Новый Массив;
Генератор = Новый ГенераторСлучайныхЧисел;
ТипыОстатковКупленныеТовары = Перечисления.ТипыОстатков.КупленныеТовары;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Товары", Товары);
Запрос.Текст = "ВЫБРАТЬ
| ЦеныПоставщиковСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныПоставщиковСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныПоставщиков.СрезПоследних(, Номенклатура В (&Товары)) КАК ЦеныПоставщиковСрезПоследних";
Выборка = Запрос.Выполнить().Выбрать();
НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
Попытка
Для Каждого Склад Из Склады Цикл
Магазин = Склад.Владелец;
ДокументОбъект = Документы.ВводОстатков.СоздатьДокумент();
ДокументОбъект.Дата = ДатаЗаписиОстатков;
ДокументОбъект.Фирма = Организация;
ДокументОбъект.СтруктурнаяЕдиница = Магазин;
ДокументОбъект.ТипОстатков = ТипыОстатковКупленныеТовары;
ДокументОбъект.Комментарий = ТекущаяДата();
Для Каждого Товар Из Товары Цикл
Выборка.Сбросить();
Если Выборка.НайтиСледующий(Товар, "Номенклатура") Тогда
НоваяСтрока = ДокументОбъект.Состав.Добавить();
НоваяСтрока.Номенклатура = Товар;
НоваяСтрока.Склад = Склад;
НоваяСтрока.Количество = Генератор.СлучайноеЧисло(100, 500);
НоваяСтрока.Цена = Выборка.Цена;
НоваяСтрока.СуммаБезНДС = Выборка.Цена * НоваяСтрока.Количество;
НоваяСтрока.Всего = НоваяСтрока.СуммаБезНДС;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ДокументОбъект.Состав) Тогда
ДокументОбъект.ДополнительныеСвойства.Вставить("ОтключитьКонтрольМестаСозданияДокумента", Истина);
УстановитьДополнительныеСвойстваНовогоОбъекта(ДокументОбъект);
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Массив.Добавить(ДокументОбъект.Ссылка);
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
КонецПопытки;
Для Каждого Док Из Массив Цикл
ДокОбъект = Док.ПолучитьОбъект();
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
ПоместитьВоВременноеХранилище(Массив, АдресРезультата);
КонецПроцедуры
ПоказатьПроблема в следующем: при первом запуске все документы записываются в базу, но не все проводятся из-за неустранимого конфликат блокировок, при всех последующих запусках все документы проводятся, никаких конфликтов нет, из-за чего это может быть?
UPD.
Разделение итогов по регистру, на котором происходит конфликт блокировок, включено.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3)
Ты открываешь транзакцию внутри СоздатьВводОстатков строкой НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); После этого все блокировки, накладываемые внутри обработки проведения документа как вручную, так и платформой, держатся до конца этой твоей транзакции.
Потом один из документов при проведении наступает на блокировку, которую наложил и не снял предыдущий документ и всё.
внешней транзакции нет
Есть. Ты же ее и сделал.
Ты открываешь транзакцию внутри СоздатьВводОстатков строкой НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); После этого все блокировки, накладываемые внутри обработки проведения документа как вручную, так и платформой, держатся до конца этой твоей транзакции.
Потом один из документов при проведении наступает на блокировку, которую наложил и не снял предыдущий документ и всё.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот