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