Имя: Пароль:
1C
1С v8
Блокировки при записи НЕпересекающихся наборов измерений регистра сведений
0 irina2002
 
25.11.19
20:49
1С в режиме совместимости 8.2.16, обычные формы, самописная. режим управления блокировками - автоматический

провожу эксперимент по выявлению избыточных блокировок при записи НЕпересекающихся наборов измерений.
выполняю код ниже на двух клиентах одновременно. первый клиент подключен к отладке, второй - нет. на первом клиенте останавливаюсь в точке останова , до завершения транзакции. на втором клиенте ожидаю завершения транзакции.
но второй клиент сообщает об ошибке: превышено время ожидания на блокировку.

НачатьТранзакцию();
РегистрМенеджер = регистрысведений.КакойНибудьНепериодическийРегистр.СоздатьМенеджерЗаписи();
РегистрМенеджер.дата = ТекДата;
РегистрМенеджер.товар = Товар;
РегистрМенеджер.Магазин = Магазин;
РегистрМенеджер.Записать(Истина);
ТОЧКА ОСТАНОВА:  ЗафиксироватьТранзакцию();
1 mistеr
 
25.11.19
20:52
(0) База файловая?
2 irina2002
 
25.11.19
20:55
(1) Серверная, MSSQL 2016
3 irina2002
 
25.11.19
21:00
4 irina2002
 
25.11.19
21:02
вопрос: откуда берутся блокировки и как обеспечить параллельную запись.
5 H A D G E H O G s
 
25.11.19
22:21
Я вряд ли смогу вам объяснить
6 H A D G E H O G s
 
25.11.19
22:22
Если в РС записывается новая запись по этим измерениям, то эта запись будет блокировать диапазон индексов рядом.

Именно рядом.
Сверху и снизу.

Рядом у вас оказывается запись из 2-ой транзакция скорее всего.
7 H A D G E H O G s
 
25.11.19
22:26
На пальцах:
У меня есть справочник:
http://prntscr.com/q1xuob
Там товары выстроены в порядке возрастания GUID, это видно по коду, да и в наименование я воткнул номер

Если в первой транзакции я буду записывать Яблоко, а во второй - Помело - то все я меня будет хорошо.
Если же во второй транзакции я буду записывать Грушу, то словлю блокировку.
8 palsergeich
 
25.11.19
22:31
Ужас какой, где в 19 году еще можно найтиконфуна автоматических блокировках
9 Сияющий в темноте
 
25.11.19
22:34
я бы сказал не рядом,а будет блокировать то место,куда будет вставляться значение,хотя,вроде как oracle умеет это понимать и будет блокировать неподтвержденную транзакцию точно по индексу,а вот mssql не версионник,у него неподтвержденной транзакции в таблице быть не может.
10 H A D G E H O G s
 
25.11.19
22:40
(9) Ага, ага.
Правда все меняется, когда приходят они:
    НачатьТранзакцию();
    ТекДата=ТекущаяДата();
    
    Набор=РегистрыСведений.КакойНибудьНепериодическийРегистр.СоздатьНаборЗаписей();
    Набор.Отбор.дата.Установить(ТекДата);
    Набор.Отбор.товар.Установить(товар);
    Набор.Отбор.Магазин.Установить(Магазин);
    РегистрМенеджер=Набор.Добавить();
    
    РегистрМенеджер.дата = ТекДата;
    РегистрМенеджер.товар = Товар;
    РегистрМенеджер.Магазин = Магазин;
    Набор.ОбменДанными.Загрузка=Истина;
    Набор.Записать(Ложь);
    
    ЗафиксироватьТранзакцию();


Тут проблема то не во вставке, а в удалении.
11 H A D G E H O G s
 
25.11.19
22:43
Но если мы запретим удалять а просто скажем - ебашь вот этой конструкцией
Набор.ОбменДанными.Загрузка=Истина;
то никакую блокировку то мы не словим, но и 1С не будет контролить дубли и выстрелит что то типа такого в худшем случае:
http://prntscr.com/q1y4pl

И я бы так не делал
12 H A D G E H O G s
 
25.11.19
22:44
p.s. Я бы вообще на атоматических ничего бы не делал и свалил бы из этой фирмы.
13 Zerga
 
25.11.19
22:56
Записей в таблице сколько?
14 Злопчинский
 
26.11.19
01:23
а если ставить в "очередь" и писать последовательно из очереди?
15 irina2002
 
26.11.19
07:44
(11) "ОбменДанными.Загрузка = истина" не помогла справиться с блокировками.
но заметка про запрет удаления интересная. проверю.
16 Сияющий в темноте
 
26.11.19
08:48
(11)можно еще поставить замена записей в истина,тогда записи запишутся поверх,и мы ничего не увидим.

удаление печально тем,что запись реально остается и мешает.

хотя,у горе версионника firebird, записи живут и после подтверждения транзакции,но с пометкой удалено,кроме того,для него есть проблема с уникальностью индекса-он отслеживается уже на более высоком уровне,а внутри все индексы не уникальные-печаль сей басни в том,что получаем отлуп не в момент записи,а в момент подтверждения транзакции.

вернувшись к нашим баранам-когда мы накладываем отбор на регистр,то блокировка будет стааится по этому отбору,а что мы там уже делаем-не важно,мораль-управляемые блокировки и ставить их вручную на то,что нужно. опять же,блокировка ставится до доступа к данным,чтобы при доступе уже исключения не ловить-да-будет медленнее,да параллельность сильно пострадает,но перезаписи поверх или вставки повторного значения не будет.
17 Сияющий в темноте
 
26.11.19
08:50
ОбменДанными.Загрузка отключает все проверки на уровне платформы,а не на уровне sql.
18 irina2002
 
26.11.19
08:53
(17) точно! флаг "Загрузка" платформой не разбирается, вроде. поправьте, если я не права.
19 irina2002
 
26.11.19
11:09
(10) получилось на платформе 8.3 в режиме управляемых блокировок
20 Fragster
 
гуру
26.11.19
11:16
(11) это в новых платформах починили, вроде
21 Fragster
 
гуру
26.11.19
11:16
в смысле контроля дублей
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший