| 
    
        
     
     | 
    
  | 
Блокировки 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) можно выйти из положения, поместив выборку по ЗаказуПокупателя во временную таблицу, а потом её уже отфильтровать по номенклатуре.     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |