![]() |
|
Блокировки ms sql, вопрос. | ☑ | ||
---|---|---|---|---|
0
ssh2006
27.03.13
✎
17:28
|
Разбирался почему не удается провести параллельно два разных заказа покупателя с одинаковой номенклатурой. В итоге выяснил следующее:
Запускаем последовательно в разных сеансах код: НачатьТранзакцию(); Запр.Текст = "ВЫБРАТЬ | ЗаказыПокупателей.ЗаказПокупателя, | ЗаказыПокупателей.Номенклатура, | ЗаказыПокупателей.ХарактеристикаНоменклатуры, | ЗаказыПокупателей.Количество |ИЗ | РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей |ГДЕ | ЗаказыПокупателей.ЗаказПокупателя = &ТекЗаказ | |ДЛЯ ИЗМЕНЕНИЯ"; Запр.УстановитьПараметр("ТекЗаказ", ТекЗаказ); Запр.Выполнить().Выгрузить().ВыбратьСтроку(); В каждом сеансе устанавливается отбор на разные заказы, причем в записях регистра по этим заказам есть некоторая общая номенклатура. Для ДЛЯ ИЗМЕНЕНИЯ указано, чтобы получить SERIALIZABLE, режим блокировок - автоматический. У регистра проиндексированы измерения ЗаказПокупателя и Номенклатура Запросы выполняются параллельно, конфликта блокировок нет. Теперь если же добавить в условие запроса еще и отбор на общую для этих заказов номенклатуру: ЗаказыПокупателей.Номенклатура = &Ном, и повторить параллельный запуск то второй запрос отвалится по таймауту на блокировке. Пытаясь понять в чем дело я посмотрел планы запросов, во втором запросе добавляется Index Seek по индексу по номенклатуре, в результате залоченнымми оказываются все записи с указанной номенклатурой, получается избыточная блокировка. Это сразу должно было быть понятно? Может убрать нафиг этот индекс по номенклатуре? Конфа на базе УТ 10. Поправьте, что не так. |
|||
1
Fragster
гуру
27.03.13
✎
17:29
|
добавь дату в условия
|
|||
2
Fragster
гуру
27.03.13
✎
17:30
|
ну и да - правильнее на управляемые блокировки переходить
|
|||
3
Fragster
гуру
27.03.13
✎
17:31
|
(1)+ а, это ТЧ - тогда фигню сморозил, ХЗ чтотам :(
разве только во вложенный запрос оборачивать |
|||
4
ssh2006
27.03.13
✎
17:33
|
(3) в смысле ТЧ? Запрос к таблице РГ накопления
|
|||
5
Fragster
гуру
27.03.13
✎
17:34
|
(4) это я туплю! тогда дата поможет!
|
|||
6
Maxus43
27.03.13
✎
17:35
|
или предварительно сделать запрос по регистру без ДЛЯ ИЗМЕНЕНИЯ, вытащив регистраторы, а потом вторым запросом залочить с отбором по регистраторам
|
|||
7
krbIso
27.03.13
✎
17:37
|
ДЛЯ ИЗМЕНЕНИЯ это хинт поставить U блокировку, SERIALIZABLE ставится в автоматическом режиме у необъектных данных.
|
|||
8
Spieluhr
27.03.13
✎
17:41
|
(0) т.е. Вы хотите получить от блокировок MS SQL тот же эффект, как если бы был управляемый режим блокировок? на набор измерений?
|
|||
9
krbIso
27.03.13
✎
17:43
|
"В каждом сеансе устанавливается отбор на разные заказы"
"Теперь если же добавить в условие запроса еще и отбор на общую для этих заказов номенклатуру" все логично в первом случае у тебя блокировались разные ресурсы, во втором есть общий ресурс. |
|||
10
Maxus43
27.03.13
✎
17:43
|
регистр подчинён регистратору, если в разрезе него вытащить данные - то и получится типа управляемой блокировки, на наборы записей регистраторов. иль не?
|
|||
11
ssh2006
27.03.13
✎
17:46
|
(8) а чем здесь управляемый режим поможет? Менеджер блокировок пропустит обе исключительеные блокировки, а дальше в ms sql уже отвалится по блокировкам субд
|
|||
12
Fragster
гуру
27.03.13
✎
17:47
|
(11) вместо REPEATABLE READ будет READ COMMITTED
|
|||
13
Fragster
гуру
27.03.13
✎
17:48
|
(12)+ но скажи лучше, помогло ли добавление периода (хоть и изврат :) )
|
|||
14
Spieluhr
27.03.13
✎
17:51
|
(12) вместо SERIALIZABLE
|
|||
15
Fragster
гуру
27.03.13
✎
17:53
|
(14) для мсскуля - именно repeatable read
|
|||
16
ssh2006
27.03.13
✎
19:04
|
(13) если задавать условие на равенство периода, то получается один Clustered Index Seek и все хорошо,
если период =< задать, то тот же план что и без условия на период с поиском по индексу номенклатуры |
|||
17
Fragster
гуру
27.03.13
✎
19:12
|
(16) а у тебя документы разными периодами пишут данные?
|
|||
18
ssh2006
27.03.13
✎
19:42
|
(17) изыскания начались с того что в модуле проведения (документ изменение заказа) есть запрос по этому регистру, к ВТ обороты, который не имеет ограничений по началу периода, а по концу периода ограничен моментом времени проводимого документа, отсюда получился тестовый запрос к записям таблицы движений регистра и ограничение на период <=
(12) а ведь верное замечание должно быть насчет управляемых блокировок. На скуле всегда будет read committed, а что выше обеспечивает уже менеджер блокировок 1с, а на скл уходит в любом случае read committed, так ведь?. И такая ситуация как в примере через явное наложение блокировок должна разрешиться (15) думаю (14) имелл ввиду что вместо serializable, как в моем примере. |
|||
19
Fragster
гуру
27.03.13
✎
19:44
|
(18) обороты без ограничения на начало периода и с ограничением на конец называются остатки...
|
|||
20
Fragster
гуру
27.03.13
✎
19:44
|
(18).2 да
|
|||
21
ssh2006
27.03.13
✎
20:19
|
(19) если речь про ресурс оборот
|
|||
22
ssh2006
27.03.13
✎
20:21
|
(20) ок, спс
|
|||
23
ssh2006
28.03.13
✎
10:59
|
В (0) можно выйти из положения, поместив выборку по ЗаказуПокупателя во временную таблицу, а потом её уже отфильтровать по номенклатуре.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |