Имя: Пароль:
1C
1С v8
Управляемые блокировки
,
0 PsyTech
 
20.02.19
16:02
8.3, Режим управления блокировкой = Управляемый.
Устанавливаю блокировку по измерению регистра
            Блокировка = Новый БлокировкаДанных;
            ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.МойРегистр");
            ЭлементБлокировки.УстановитьЗначение("Изм1", Зн1);
            ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
            Блокировка.Заблокировать();

получаю набор записей с отбором по регистратору, который в данный момент ожидает завершения блокировки:
                НаборЗаписей = РегистрыНакопления.МойРегистр.СоздатьНаборЗаписей();
                НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Регистратор);
                НаборЗаписей.Прочитать();
В результате дэдлок при попытке прочитать набор записей.
Вопрос: как правильно установить блокировку, чтоб в этой ситуации дэдлока не было?
1 xXeNoNx
 
20.02.19
16:52
(0) Установить рид комитед снэпшот...
2 Spieluhr
 
20.02.19
16:57
Набор записей всегда читается в неявной транзакции. У вас там точно дедлок, а не ожидание на блокировке?
3 xXeNoNx
 
20.02.19
17:00
(0) еще не указан режим совместимости...
4 decdmb
 
20.02.19
17:23
Считать данные по регистратору запросом и загрузить ТЗ в набор?
5 xXeNoNx
 
20.02.19
17:44
(4) Зачем?
6 Cyberhawk
 
20.02.19
19:14
Так НЗ читаешь-то в транзакции пади
7 Cyberhawk
 
20.02.19
19:15
Режим совместимости какой?
8 Cyberhawk
 
20.02.19
19:17
Если 8.3, то читай набор записей запросом, а не в объектной модели - тогда не будет разделяемой упр. блокировки наложено до конца транзакции. Ну это если конечно тебе он только для чтения нужен.
9 PsyTech
 
21.02.19
08:05
НЗ читаю в транзакции
Режим совместимости 8.3.6
(8) нужно еще изменение
10 PsyTech
 
21.02.19
08:06
(2) ага: неустранимый конфликт блокировок
11 Cyberhawk
 
21.02.19
08:33
(9) Может записей в регистре мало, что блокируется не область по измерению, а весь регистр вообще?
12 PsyTech
 
21.02.19
08:48
записей много
13 palsergeich
 
21.02.19
08:52
(12) записей с отбором по этому измерению много?
Если больше 100тыс то происходит эскалация управляемых блокировок
14 palsergeich
 
21.02.19
08:56
У дедлока упр блокировках 2 причины:
Захват ресурсов в разном порядке.
Эскалация.
В вашем случае похоже на эскалацию.
Вроде как с 8.3.8 (не помню версию платформы) можно отключить эскалацию.
15 PsyTech
 
21.02.19
09:09
записей не больше 50. Да это эскалация.
НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Регистратор);
Регистратор имеет записи по этому регистру с Зн1 и без него.
16 palsergeich
 
21.02.19
09:12
В 82 мне пришлось полностью переписать логику и отказаться от наборов, по другому побороть не вышло.
17 PsyTech
 
21.02.19
09:18
А возможно как-то кодом 1с получить список тех, кто ожидает окончания этой блокировки?
18 palsergeich
 
21.02.19
09:19
В базе без пользователей при параллельной обработке 2х непересекающихся пространств блокировок на одном РС с где то около 2к записей в каждом иногда (но далеко не всегда) одна из транзакций делала эскалацию.
Хотя явных документированных причин не было.
Плюнул и начал записывать менеджером и читать запросом после установки упр блокировки и все стало ок.
19 palsergeich
 
21.02.19
09:20
(17) только ТЖ
20 Cyberhawk
 
21.02.19
09:24
(17) А какая тебе разница, кто ожидает? Твой сеанс что ли становится жертвой?
21 Wingless
 
21.02.19
09:29
(0)

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.МойРегистр");
ЭлементБлокировки.УстановитьЗначение("Изм1", Зн1);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.МойРегистр.НаборЗаписей");
ЭлементБлокировки.УстановитьЗначение("Регистратор", Регистратор);

Блокировка.Заблокировать();
22 palsergeich
 
21.02.19
09:44
Тут есть ещё один ньюанс.
Регистр - подчинённый регистратору.
Ты же понимаешь, что делая
НаборЗаписей = РегистрыНакопления.МойРегистр.СоздатьНаборЗаписей();
                НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Регистратор);
                НаборЗаписей.Прочитать();
Ты накладываешь блокировку на другое пространство?
(21) кстати да.
23 palsergeich
 
21.02.19
09:49
Я что то упустила подчинённость регистратору ..
24 ДенисЧ
 
21.02.19
09:52
(23) Сестра Вачовски? "упустила "
25 palsergeich
 
21.02.19
10:02
(24) Т9 коварен.
26 PsyTech
 
21.02.19
10:07
(22) Да. А как быть?) Цель вообще такая: заменить значение по измерению регистра накопления.
27 palsergeich
 
21.02.19
10:10
Сначала получаешь массив регистраторов.
Потом устанавливаешь блокировку на регистраторы и измерение. С большой долей вероятности блокировка на изменение избыточна. См (21) потом уже делаешь бизнес логику.
28 palsergeich
 
21.02.19
10:12
Ибо изменить существующие записи при заблокированном регистраторе не выйдет
29 palsergeich
 
21.02.19
10:15
Если нужен ещё и запрет на чтение набором в момент операции (ну это вряд ли конечно) тогда блокировка на измерение необходима, иначе она избыточна
30 Cyberhawk
 
21.02.19
10:19
"Цель вообще такая: заменить значение по измерению регистра накопления" // На кой тогда блокировка по измерению, если за один такт манипулировать все равно можешь максимум набором записей только какого-то одного регистратора?
31 PsyTech
 
21.02.19
10:51
(27) Так вроде работает, спасибо
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший