|
Блокировки при записи НЕпересекающихся наборов измерений регистра сведений | ☑ | ||
---|---|---|---|---|
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
|
https://yadi.sk/i/vyT_ZzMeNl5jbA это стенд
|
|||
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
|
в смысле контроля дублей
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |