|
Управляемые блокировки | ☑ | ||
---|---|---|---|---|
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) Так вроде работает, спасибо
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |