|
Конфликты блокировок - можно ли как-то поправить? | ☑ | ||
---|---|---|---|---|
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) Позволяет ли ваша система инициировать удаление прибора, если в настоящее время другие пользователи производят модификацию его деталей? Если нет, то, каким образом вы эту ситуацию обрабатываете. Аналогичный вопрос по модификации деталей, входящих в состав прибора, который удаляется другим пользователем в настоящий момент.
Еще, скажите, в каком режиме управления блокировками работает ваша система. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |