|
Блокировка и регистр сведений | ☑ | ||
---|---|---|---|---|
0
Dimon1C
11.07.23
✎
08:00
|
Добрый день.
Подскажите, есть регистр Штрихкоды, у него одно измерение Штрихкод (числовое значение). Стоит задача написать функцию, которая будет возвращать следующее значение по порядку, и это значение должно записаться в этот регистр. Обращение к функции будет частое и с разных сеансов. Насколько корректна след. функция. НачатьТранзакцию(); Попытка БлокировкаДанных = Новый БлокировкаДанных; ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("РегистрСведений.Штрихкоды"); ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; БлокировкаДанных.Заблокировать(); НовыйШтрихкод = 100000; Запрос = Новый Запрос("ВЫБРАТЬ | МАКСИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод |ИЗ | РегистрСведений.Штрихкоды КАК Штрихкоды); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Если Выборка.Штрихкод <> NULL Тогда НовыйШтрихкод = Выборка.Штрихкод + 1; КонецЕсли; КонецЕсли; НоваяЗапись = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи(); НоваяЗапись.Штрихкод = НовыйШтрихкод; НоваяЗапись.Записать(); ЗафиксироватьТранзакцию(); Исключение НовыйШтрихкод = 0; ОтменитьТранзакцию(); ВызватьИсключение "Ошибка при создании штрихкода. Попробуйте снова. " + ОписаниеОшибки(); КонецПопытки; Возврат НовыйШтрихкод; |
|||
1
mistеr
11.07.23
✎
08:19
|
1. Чем не устроил механизм генерации штрихкодов из типовых?
2. Если будет реально большая параллельная нагрузка, лучше использовать документ. |
|||
2
Мультук
11.07.23
✎
08:28
|
(0)
Я конечно извиняюсь: 1) У вас только "свои" штрихкоды ? Ибо, если и "свои" и чужие -- может получиться нехорошо. 2) Число для хранения штрихкода. Не строка ? |
|||
3
Dimon1C
11.07.23
✎
08:47
|
(1) база самописка, особо не трогали БСП -шные функции
ну я бы не сказал чтоб прям много, просто вероятность небольшая есть, что одномоментно могут запустить процедуру. (2) да свои только штрихкоды ну у нас число, так проще Хотелось просто понять, функция корректная, а то ранее блокировки не использовал, мало ли что упустил |
|||
5
Dimon1C
11.07.23
✎
09:08
|
(4) Мне РС для таких целей нравится больше
ТЗ на такие штрихкоды выдал производитель мед. оборудования, все считывается корректно. |
|||
6
mistеr
11.07.23
✎
09:25
|
(3) Код содержит несколько мин замедленного действия.
|
|||
7
mikecool
11.07.23
✎
09:27
|
как самое простое - все действия по подготовке блокировки вынести из транзакции, оставить только Заблокировать()
|
|||
8
majkk
11.07.23
✎
09:28
|
(0) А зачем здесь вообще блокировка? Чтобы что?
|
|||
9
dmt
11.07.23
✎
09:30
|
(6) это каких? выглядит норм
|
|||
10
mistеr
11.07.23
✎
09:32
|
(8) Чтобы поставить в очередь два параллельных сеанса.
|
|||
11
2S
11.07.23
✎
09:37
|
может через очереь писать?
|
|||
12
Михаил Козлов
11.07.23
✎
10:18
|
Что-то похожее было то ли в УТ 10.2, то ли 10.3.
Переделывал: завел отдельный РС (кажется, не помню) для хранения максимального значения ШК - блокировки регистра ШК замучили. |
|||
13
H A D G E H O G s
11.07.23
✎
11:06
|
(6) например?
(0) почему Измерение, а не Ресурс? |
|||
14
majkk
11.07.23
✎
11:17
|
(10) А смысл? Внутри попытки пишешь в регистр. Либо записал, либо нет. Вот и все. Зачем здесь блокировка?
|
|||
15
H A D G E H O G s
11.07.23
✎
11:19
|
(14) 2 сеанса могут прочитать одно и тоже значение.
|
|||
16
mistеr
11.07.23
✎
11:39
|
(9) (13) Посмотрел еще раз и уже сам не вижу. :) По блокировкам, во всяком случае.
|
|||
17
mistеr
11.07.23
✎
11:39
|
(14) Если нет, что дальше?
|
|||
18
Timon1405
11.07.23
✎
12:10
|
(13) в типовых тоже измерение. позволяет вести несколько ШК для товара: например, ШК поставщика и свои внутренние. различать их друг от друга можно в реквизите тип ШК регистра(в типовой нет)
|
|||
19
H A D G E H O G s
11.07.23
✎
12:12
|
(18) Даже не говорите про типовые ШК :-). Каждый раз приходится переносить номенклатуру в Измерения, когда для разных номенклатур необходимо заводить одинаковые ШК.
|
|||
20
mistеr
11.07.23
✎
12:15
|
(19) А в каком случае это нужно? ШК как бы для идентификации задуман. :)
|
|||
21
H A D G E H O G s
11.07.23
✎
12:32
|
(20) Всякие подарочные упаковки в алкоголе. Оформляются как отдельная позиция номенклатуры (так уж повелось), а ean13 тот же.
|
|||
22
Новиков
11.07.23
✎
18:00
|
(21) а нет такой практики, в этом случае - приклеить свой ШК? Упаковка не красивая будет или что? Алкашовскую же марку все равно надо будет читать, а она вроде уникальная же?
|
|||
23
ДедМорроз
11.07.23
✎
19:32
|
Это через модификаторы решается,но везде они есть.
Тогда позиция + можификатор - это подарочная упаковка и товар. |
|||
24
majkk
11.07.23
✎
21:57
|
(17) Все то же, что у ТС в блоке ИСКЛЮЧЕНИЕ, только без ОтменитьТранзакцию()
|
|||
25
OldCondom
11.07.23
✎
21:59
|
Блокировка на весь регистр? Это что за экстренные меры?
|
|||
26
OldCondom
11.07.23
✎
22:00
|
Если выборка. Следующий (). О боги. Если уж весь регистр блокируешь, экономь каждую копеечку. Запрос. Пустой()
|
|||
27
OldCondom
11.07.23
✎
22:03
|
Плюс ситуация : у пользователя тремор, нажал кнопку 45 раз. Что он получит в итоге?
|
|||
28
OldCondom
11.07.23
✎
22:05
|
А то у нас тут как раз случай :пользователь жмет "получить счёт" 20 раз, все 20 раз отрабатывают, пользователь что там получает, супер. Только у нас 19 дублей.
|
|||
29
mistеr
11.07.23
✎
23:30
|
(24) OK, вызывающий получает бяку и.. что делает?
|
|||
30
mistеr
11.07.23
✎
23:30
|
(25) А на что надо?
|
|||
31
OldCondom
11.07.23
✎
23:36
|
(30) так на диск же
|
|||
32
majkk
12.07.23
✎
07:52
|
(29) То же, что и раньше. В чем вопрос? В приведенном куске кода блокировка и транзакция лишние
|
|||
33
majkk
12.07.23
✎
08:01
|
(15) Этот код никогда не вернет два одинаковых и не нулевых значения для двух сеансов.
|
|||
34
Dimon1C
12.07.23
✎
08:13
|
(32) без блокировки был случай когда вернулся один и тот же номер, то есть два сеанса успели прочитать одно и то же значение.
вот поэтому и созрел вопрос модификации функции и блокировки |
|||
35
majkk
12.07.23
✎
08:17
|
(34) Вы сломали регистр сведений? Что-то не верится
|
|||
36
majkk
12.07.23
✎
08:20
|
(34) Двумя сеансами прочитать одно и то же значение из регистра можно. Записать нельзя.
|
|||
37
Dimon1C
12.07.23
✎
08:20
|
(35) почему сломали, просто сеансы поочереди переписали последнее значение, то есть они одномоментно считали одно и то последнее значение, а потом в регистр записали поочереди это последнее значение +1.
|
|||
38
majkk
12.07.23
✎
08:22
|
(37) И вы получили в регистре сведений неуникальные значения измерения? Не верю
|
|||
39
Dimon1C
12.07.23
✎
08:23
|
(38) вы с РС работали, этот код если выполнить дважды с одним и тем же штрихкодом, просто перезапишет существующую запись
НоваяЗапись = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи(); НоваяЗапись.Штрихкод = НовыйШтрихкод; НоваяЗапись.Записать(); |
|||
40
majkk
12.07.23
✎
08:25
|
(39) Понятно
|
|||
41
mistеr
12.07.23
✎
11:16
|
(31) Не понял
|
|||
42
majkk
12.07.23
✎
11:48
|
(39) Можно было бы написать НоваяЗапись.Записать(ложь) вместо блокировки
|
|||
43
mistеr
12.07.23
✎
11:54
|
(42) Ты на машине ездишь?
Две машины на перекрестке. Если обе газанут, то обе побьются, но одна может проскочить. Ты предлагаешь алгоритм "если не проскочил, пробуй еще, пока не проскочишь или не развалишься". Но во всем мире используют светофоры. Так понятно? |
|||
44
H A D G E H O G s
12.07.23
✎
12:01
|
(42) Но не нужно.
|
|||
45
majkk
12.07.23
✎
12:07
|
(44) Блокировка так или иначе будет установлена. Вопрос в том, когда. Устанавливать ли блокировку пораньше - вопрос спорный
|
|||
46
mikecool
12.07.23
✎
12:08
|
(45) вот именно, что должна быть установлена ранее
|
|||
47
H A D G E H O G s
12.07.23
✎
12:10
|
(45) Нет там ничего спорного.
|
|||
48
mistеr
12.07.23
✎
13:09
|
(45) Вопрос пораньше или попозже начинает иметь значение, когда там десятки сеансов в секунду долбятся.
А в данному случае блокировка пораньше позволяет каждому сеансу получить свой номер без проблем. А не городить сложную логику обработки ошибок и долго вылавливать в ней баги. |
|||
49
majkk
12.07.23
✎
13:49
|
(48) Десятки сеансов в секунду долбятся почитать. Пара сеансов в минуту долбятся записать. Иногда, раз в год, эти два сеанса в минуту совпадают...
|
|||
50
mistеr
12.07.23
✎
14:18
|
Те которые почитать, блокировку на весь регистр не ставят и проблем не создают.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |