Имя: Пароль:
1C
1С v8
Блокировки 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) можно выйти из положения, поместив выборку по ЗаказуПокупателя во временную таблицу, а потом её уже отфильтровать по номенклатуре.