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