Имя: Пароль:
1C
1С v8
помогите понять поведение управляемых блокировок
0 blesha
 
25.09.20
23:57
платформа 8.3, режим управление блокировками - управляемый
есть регистр сведений, три измерения - тип число, ресурс - число. заполнен тривиально:
измерение1     измерение2     измерение3     ресурс1
       1                       2                       3                       4
       1                       3                       2                       4
       2                       1                       3                       4
       2                       3                       1                       4
       3                       1                       2                       4
       3                       2                       1                       4

если выполнить два следующих фрагмента параллельно, то возникает ожидание на управляемых блокировках

фрагмент1:
НачатьТранзакцию();
Блокировка = Новый БлокировкаДанных;
ЭлБлокировки = Блокировка.Добавить("РегистрСведений.РегистрСведений1");
ЭлБлокировки.УстановитьЗначение("Измерение1", 1);
ЭлБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Предупреждение("ждем-с");
ЗафиксироватьТранзакцию();

фрагмент2:
НачатьТранзакцию();
Блокировка = Новый БлокировкаДанных;
ЭлБлокировки = Блокировка.Добавить("РегистрСведений.РегистрСведений1");
ЭлБлокировки.УстановитьЗначение("Измерение2", 1);
ЭлБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Предупреждение("ждем-с");
ЗафиксироватьТранзакцию();

ПОЧЕМУ возникает ожидание?
Ведь в первом фрагменте блокируются первая и вторая строки - именно в них 1 в Измерение1
Во втором фрагменте должны блочится строки у которых 1 в Измерение2, а это третья и пятая строки......

Вычитал это в книге одной, не поверил, решил проверить и офигел, спать не могу теперь)
1 youalex
 
26.09.20
05:42
база серверная?
2 Конструктор1С
 
26.09.20
06:56
Предупреждение("ждем-с");

What?!??
3 ДенисЧ
 
26.09.20
06:59
(2) ЧТо смущает?
4 Chameleon1980
 
26.09.20
07:11
(3)пердупреждение на сервере
5 ДенисЧ
 
26.09.20
07:31
(4) А кто сказал про сервер? Может, там толстый клиент?
6 ptiz
 
26.09.20
08:32
(0) Надо указывать ВСЕ измерения до нужного по порядку в метаданных.
Если блокируешь Измерение2, то обязательно указывать и Измерение1. Иначе заблокируется всё.
7 Конструктор1С
 
26.09.20
08:42
(5) надо использовать паузу, Карл, паузу!
8 blesha
 
26.09.20
09:51
(6) получается есть аналогия как в запросах когда в индекс не попадаешь и запрос в скан сваливается?
9 blesha
 
26.09.20
09:51
(1) да
10 Timon1405
 
26.09.20
09:52
(0) представьте ваш регистр как 3херный куб, где 3 оси - ваши измерения а на пересечении "в воздухе" висят ресурсы. блокировкой 1 вы блокируете 2 полных(!) горизонтальных "слоя", а блокировкой 2 пытаетесь заблокировать вертикальный слой, который имеет пересечения с горизонтальным.
11 blesha
 
26.09.20
09:52
(4) это из учебника пример
12 blesha
 
26.09.20
10:14
(10) да, логично. платформа видимо блочит именно пространство всевозможных значений, а не имеющиеся строки. Чтобы нельзя было вставить строку "1, 1, 1, 4" защита от фантомов аки
13 mistеr
 
26.09.20
10:53
(6) Можно ссылку на доку? Нигде не видел такого.
14 mistеr
 
26.09.20
10:53
И чем это объясняется, интересно.
15 blesha
 
26.09.20
20:53
(6) опыты показали что ты не прав. можно:
ЭлБлокировки.УстановитьЗначение("Измерение2", 2);  
ЭлБлокировки.УстановитьЗначение("Измерение3", 3);
а потом заблочить
ЭлБлокировки.УстановитьЗначение("Измерение1", 1);  
ЭлБлокировки.УстановитьЗначение("Измерение2", 1);
и обе блокировки буду успешно установлены.

аналогия с многомерными пространствами лучше работает
16 blesha
 
26.09.20
20:53
всем спасибо, ясно, понятно
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший