Имя: Пароль:
1C
1С v8
Конфликты блокировок - можно ли как-то поправить?
,
0 xaozai
 
03.04.14
10:19
Есть справочник (Детали), в котором часто создаются новые элементы и перезаписываются существующие. Пользователей в базе работает много и иногда получается так, что почти одновременно записываются десятки элементов этого справочника.
Если при этом попытаться выполнить простой запрос:
ВЫБРАТЬ
    Детали.Ссылка
ИЗ
    Справочник.Детали КАК Детали
ГДЕ
    Детали.Прибор = &Прибор
    И НЕ Детали.ПометкаУдаления

Возникает конфликт блокировок на строке:
Результат = Запрос.Выполнить();

Ошибка при вызове метода контекста (Выполнить): Ошибка выполнения запроса "Конфликт блокировок при выполнении транзакции:
Microsoft OLE DB Provider for SQL Server: Lock request time out period exceeded.
HRESULT=80040E31, SQLSrvr: Error state=34, Severity=10, native=1222, line=1
"'
Можно ли как-то избежать конфликта блокировок?
1 saaken
 
03.04.14
10:33
Транзакция где начинается?
2 xaozai
 
03.04.14
10:34
(1) Явных транзакций нигде нет.
3 Рэйв
 
03.04.14
10:34
(0)Юзай управляемые блокировки
4 saaken
 
03.04.14
10:37
(2) ну а не явных? Спрошу по другому, в обработке проведения запрос?
5 dimaldinho
 
03.04.14
10:42
(0) Если запрос выполняется вне транзакции, блокировок быть не может. Если в транзакции, нужно честно признаться, где именно выполняется запрос.
6 xaozai
 
03.04.14
10:46
(3) Хотелось бы оставить автоматический режим.
(4)(5) Запрос вызывается из подписки на событие ПриЗаписи.
7 xaozai
 
03.04.14
10:47
(6) Но при записи другого справочника, не этого.
8 ДенисЧ
 
03.04.14
10:47
(6) А говоришь, транзакций нет...
9 ivanovnm
 
03.04.14
10:47
(6) Юзай событие ПередЗаписью
10 ivanovnm
 
03.04.14
10:48
(6) Юзай ПередЗаписью если возможно
11 vi0
 
03.04.14
10:49
(0) реквизит Детали.Прибор индексирован?
12 ivanovnm
 
03.04.14
10:49
(7) определись уже, этого или другого?
13 xaozai
 
03.04.14
10:52
(11) Да, индексирован.
(12) Подписка срабатывает при записи справочника Приборы. Нужно при пометке на удаление элемента справочника Приборы помечать на удаление все детали, связанные с этим прибором.
В подписке проверяется, установлена ли пометка на удаление и если установлена, выбираются детали запросом из (0) и помечаются на удаление.
14 vi0
 
03.04.14
10:57
(0) какие действия пользователей в транзакциях, которые обновляют детали, выполняются долго? Т.е. что блокирует справочник и провоцирует таймауты?
15 saaken
 
03.04.14
10:59
(0) читай данные перед записью, а обрабатывай при записи
16 ivanovnm
 
03.04.14
11:09
(15) Тогда данные будут не консинстентными.
17 ChiginAV
 
03.04.14
11:12
(15) Скорее всего не поможет. И "ПередЗаписью" и "ПриЗаписи" выполняются уже в транзакции записи
18 ivanovnm
 
03.04.14
11:13
(13) Сделай справочник "Приборы" подчиненным справочнику "Детали" и можно удалить подписку.
19 xaozai
 
03.04.14
11:19
(18) Детали могут быть не связаны с прибором.
20 vi0
 
03.04.14
11:19
(0) кстати здесь в запрос нужно добавить ДЛЯ ИЗМЕНЕНИЯ
21 ivanovnm
 
03.04.14
11:24
(19) Тогда зачем их удалять?
22 xaozai
 
03.04.14
11:25
(21) Те, которые связаны нужно удалить.
23 ivanovnm
 
03.04.14
11:26
(19) Извиняюсь перепутал. Надо сделать справочник "Детали" подчиненным справочнику "Приборы".
24 ivanovnm
 
03.04.14
11:27
(22) Они не могут быть связаны одновременно с более чем одним справочником?
25 xaozai
 
03.04.14
11:30
(20) Это вызовет блокировку этих данных. Я не понимаю, это действительно, может помочь?
(23) Такой вариант не подойдет. Детали могут быть не связаны с прибором.
(24) Нет, после того, как их связали с каким-то прибором, с другими приборами они не могут быть связаны и если прибор удаляется, удаляются и детали.
26 vi0
 
03.04.14
11:34
(25) вданной ситуации это скорее всего не поможет, но поможет избежать возможных дедлоков
есть общая рекомендация:
если в транзакции данные считываются, а потом меняются то их нужно блокировать на этапе чтения
27 saaken
 
03.04.14
11:36
Не раскрыт остался вопрос в том откуда возникает блокировка в запросе по одному прибору. Возможно система пытается заблокировать весь справочник, а не по прибору. Возможно условие по пометке удаления убрать?
28 xaozai
 
03.04.14
11:39
(27) Из запроса условие по пометке убрать? В общем-то да, можно. Из-за него может быть блокировака?
29 saaken
 
03.04.14
11:40
Или скуль при записи ставит блокировку на всю таблицу. Там вообще сколько записей в таблице?
30 vi0
 
03.04.14
11:40
(25) при каком сценарии работы пользователей могут перезаписываться детали одного прибора?
31 ivanovnm
 
03.04.14
11:43
(28) может в каких-то еще транзакциях идут обращения к деталям?
32 dimaldinho
 
03.04.14
11:45
Запрос в транзакции ставит S-блокировку на справочник детали. Она может помешать только X-блокировке при записи той же детали, которая была прочитана (а не получена) SQL-запросом.

Надо бы ЦУПом посмотреть список ожиданий на блокировках и заблокированные и блокирующие запросы.
33 xaozai
 
03.04.14
11:47
(29) На данный момент там 1 592 492 записей.
(30) Связанные только при пометке на удаление перезаписываются, а в несвязанных приборы указывают, когда связывают.
(31) Вроде бы нет нигде больше.
34 vi0
 
03.04.14
11:57
(33) если нет пересечений перезаписей деталей по одному прибору от разных пользователей, то возможно где то есть избыточное сканирование таблицы деталей в транзакции

лучше конечно инструментами все это анализировать
35 vi0
 
03.04.14
11:58
+(33)  хотя нет, тут сканирование мешать не должно
36 xaozai
 
03.04.14
12:05
Кстати, а для чего нужны вот эти поля в конструкторе?
Обязательно в правое поле добавлять данные?
http://f6.s.qip.ru/gbw3dlzp.png
37 gallam
 
03.04.14
12:09
(0)
"Можно ли как-то избежать конфликта блокировок?" - можно, если понять тип блокировки в MS SQL. Они бывают: TAB, KEY, RID, PAGE и прочие. Когда сможете это понять, то конкретно для каждого типа свой механизм действий.
38 xaozai
 
03.04.14
12:10
(36) Видимо, когда несколько таблиц в запросе, можно указать конкретную таблицу.
39 saaken
 
03.04.14
12:16
(38) и только по ней будут блокировки, иначе по всем в запросе
40 erp20
 
05.04.14
12:11
(0) Позволяет ли ваша система инициировать удаление прибора, если в настоящее время другие пользователи производят модификацию его деталей? Если нет, то, каким образом вы эту ситуацию обрабатываете. Аналогичный вопрос по модификации деталей, входящих в состав прибора, который удаляется другим пользователем в настоящий момент.
Еще, скажите, в каком режиме управления блокировками работает ваша система.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший