О блокировках данных #748786


#0 by YAGolova
Прошу помощи знатоков. Абсолютный профан в вопросе блокировок. История такая: при проведении заказов покупаля выполняются запросы опять же к заказам покупателя для некоторых проверок. И вот когда все начинают активно колотить эти заказы получается конфликт блокировок - база встает на выполении этих запросов. Режим управления блокировкой данных у заказов покупателя у нас управляемый, но кроме того что переключили свойство больше по сути ничего не сделано. Подскажите, как происходит блокировка таблиц в случае если режим блокировки - управляемый, но в коде блокировка данных не описана?
#1 by H A D G E H O G s
Никак. Не факт что у вас управляемые блокировки. В свойствах конфигурации должна стоять режим Автоматический-Управляемый.
#2 by YAGolova
Так и стоит
#3 by H A D G E H O G s
Первым первым первым делом смотрим на текст сообщения. Если текст сообщения - содержит англицкие буковски и exception всякий с примесью SQL - у вас превышения на ожиданиях блокировок СУБД. Управляемые блокировки еще даже не сработали. Если же сообщение - отечественное, то - это уже блокировки сервера 1С, наши, родные.
#4 by YAGolova
интересует: при записи блокируется вся таблица заказов или конкретная запись? при чтении запросом как блокируется таблица заказов?
#5 by YAGolova
Иностранщина)
#6 by YAGolova
поможет ли при этом описание блокировок в конфигурации?
#7 by H A D G E H O G s
Попадайте в индекс, че.
#8 by xaozai
Попробуйте блокировки вручную прописать с реквизитами шапок этих заказов.
#9 by H A D G E H O G s
нет.
#10 by YAGolova
не понял)
#11 by xaozai
Почему нет? Режим управляемый, блокировки не описаны, СУБД и не может их корректно разрулить... Разве нет?
#12 by H A D G E H O G s
Хотя, о чем я. Соседняя транзакция установила X блокировку по записи ЗаказПокупателя №01. Текущая транзакция пытается поставить S блокировку по записи ЗаказПокупателя №01. И целует веник. Переходите на 8.3, там это реализовано.
#13 by YAGolova
А чем же так отличается в этом вопросе 8.3 от 8.2?
#14 by YAGolova
Кстати сейчас у нас 1С:Предприятие 8.2 (8.2.19.106)
#15 by H A D G E H O G s
8.3 не ставит S блокировку СУБД при чтении в транзакции.
#16 by H A D G E H O G s
Это если грубо говорить. Если научно точно - она переводить базу ms sql в режим Read_Commited_Snapshot. Только "режим сомвестимость" нужен выше 8.2.
#17 by YAGolova
а описание блокировки таблицы заказов перед записью как предлагают не поможет в этом случае?
#18 by YAGolova
У меня почему то ощущение что блокируется целиком таблица заказов, т.к. я сомневаюсь что по одному и тому же контрагенту одновременно проводят заказы
#19 by xaozai
СУБД не знает, что вы только по одному контрагенту хотите...
#20 by H A D G E H O G s
Может и "вся таблица", вернее все "дерево кластерного индекса", если вы своим запросом в индекс не попали и был clustered index scan.
#21 by H A D G E H O G s
А может быть и только запись ЗаказПокупателя №1, который проводится в соседней транзакции (на соседнем ПК).
#22 by YAGolova
а при чтении данных запросом с отбором по контрагенту блокируется таблица?
#23 by xaozai
Если там нет ДЛЯ ИЗМЕНЕНИЯ, то не должно блокироваться.
#24 by H A D G E H O G s
Рекомендую подробнее изучить материалы.
#25 by YAGolova
расскажи пожалуйста как это все происходит! чет нигде не могу найти почитать
#26 by xaozai
Та он сам не знает, похоже ) Я бы блокировки прописал вручную.
#27 by H A D G E H O G s
Расскажи, что делает ПРИ ИЗМЕНЕНИИ
#28 by xaozai
Что такое ПРИ ИЗМЕНЕНИИ?
#29 by mistеr
Столько всяхой хрени наговорили, словесный понос просто. А настоящее сообщение об ошибке ТС так и не показал.
#30 by H A D G E H O G s
Для Изменения , пардон.
#31 by xaozai
#32 by YAGolova
там куча английских букв Microsoft SQL Server. Точнее к сожалению сейчас взять негде. Повторится это только завтра к вечеру...
#33 by YAGolova
хотелось бы понять общую логику работы программы и далее уже решать как исправлять
#34 by H A D G E H O G s
Че на него смотреть хотя, может, маловероятно, но взаимоблокировки.
#35 by H A D G E H O G s
Блаблабла. Своими словами. Там всего 4 слова.
#36 by YAGolova
прям по пунктам, к примеру: 1. началось проведение 2. выполение запроса на чтение - таблица заказов заблокирована (целиком или только то что выбираем?) 3. началась запись - таблица заблокирована (целиком?) Ну как то так
#37 by YAGolova
что то типо такого
#38 by H A D G E H O G s
1. началось. 2. либо целиком, либо то, что выбираем. 3. только та запись, которая записывается. Именно для таблицы ДОКУМЕНТА заказ.
#39 by YAGolova
а что определяет во втором пункте - целиком или то что выбираем?
#40 by Лефмихалыч
Одной какой-то галочки, чтобы включить и заработало, нет. Тут анализ и оптимизаяйца нужны. Главная задача оптимизации: 1. Сократить время транзакций 2. Убрать лишние запросы и лишние поля из выборки
#41 by H A D G E H O G s
Попали вы в индекс или нет. Если не попали - выполняется чтение всего индекса - его ПОПЫТКА S блокировки, но она не получится, так как часть индекса блокирована пишущей транзакцией.
#42 by mistеr
Логика работы прописана в ТВОЕМ КОДЕ. Нам ее откуда знать? Для начала нужно понять какая именно ошибка и локализовать в коде запрос, который ее вызывает.
#43 by YAGolova
к этому мнению я сам пришел))) думал вот только может поможет чудо обьект блокировка данных))
#44 by YAGolova
запрос локализовал пока его удалением, но надо возвращать...
#45 by H A D G E H O G s
покажи хоть запрос то
#46 by H A D G E H O G s
Напряженное ожидание расшифровки "Для Изменения" продолжается.
#47 by mistеr
Так в все разжевано.
#48 by MadJhey
Режим удаления движений какой стоит?
#49 by Ненавижу 1С
Обращайтесь к регистрам, а не документам
#50 by MadJhey
Кстати в ТС писал, что поставили упр. режим только у документа. Как насчет регистров? Так может быть все таки у вас авт. режим блокировки? Текст запроса в студию.
#51 by H A D G E H O G s
нет. Там полная неясность.
#52 by H A D G E H O G s
У ТС блокировки СУБД.
#53 by H A D G E H O G s
Всё плохо. 1Снеги по прежднему плавают в блокировках :-)
#54 by MadJhey
В ерунду написал, система ошибку должна выдать.
#55 by mistеr
Не знаю, мне все понятно. Но если в 4 слова, то оно транслируется в HOLDLOCK.
#56 by mistеr
->
#57 by MadJhey
Тогда это управляемый режим. Read Commited. S блокировка на время запроса. X до конца транзакции.
#58 by H A D G E H O G s
Нет. Repeatable Read устанавливает S блокировку до конца транзакции по дефолту. Для Изменения устанавливает X блокировку вместо S. Только и всего.
#59 by MadJhey
Автор написал бы какое точно сообщение выдает и запрос. А то сферический конь в вакууме.
#60 by MadJhey
для изменения устанавливает U блокировку.
#61 by mistеr
Да, прошу прощения, не HOLDLOCK, а XLOCK.
#62 by H A D G E H O G s
Точно не скажу. Автоматические - уже история. Главное, что несовместную.
#63 by mikecool
ты сдал спеца то? а то я чтото пропустил
#64 by MadJhey
Подправьте, если что: Управляемый режим. Режим - Автоматическое удаление движений. Перепроводим документ. 0. Начинается транзакция 1. Накладывается неявная упр. эксклюзивная блокировка на движения данного документа и на остатки по измерениям, используемые в движениях. Х блокировка на уровне СУБД на те же объекты. 2. Запрос к таблице заказов (что тут имеется ввиду? Таблица табл. части документа, к регистру заказов?). S блокировка на СУБД на время запроса. Блокируется или все таблица, или по ключу + запись сверху и снизу. Надо смотреть план запроса. 3. Запись движений. Тоже, что и в 1 по новым движениям. 4. Фиксация транзакции. 5. Снятие всех блокировок. Режим - Удалять автоматически при отмене проведения То же, но без пункта 1.
#65 by H A D G E H O G s
все верно. Скорее всего автор имеет ввиду запрос к шапке документа.
#66 by YAGolova
У регистров по которым проводится заказ тоже естественно стоит управляемый режим блокировки
#67 by YAGolova
Что выдает запрос пока скопировать не могу - ошибка воспроизводится только при большой нагрузке. Сегодня вечером буду ловить
#68 by YAGolova
текст запроса: ВЫБРАТЬ     РегистрСведений.МаршрутыАгентов КАК МаршрутыАгентов ИЗ     ВТКонтрагентыПоМаршруту КАК ВТКонтрагентыПоМаршруту     И НЕ ЗаказПокупателя.Ссылка = &Ссылка     И НЕ ЗаказПокупателя.Контрагент В                 (ВЫБРАТЬ                     ВТКонтрагентыПоМаршруту.Контрагент                 ИЗ     И ЗаказПокупателя.Подразделение = &Подразделение     И НЕ ЗаказПокупателя.Контрагент = &Контрагент
#69 by YAGolova
Кстати только сейчас подумал - запросы к табличной части не вызывают подобной блокировки
#70 by MadJhey
Что насчет режима удаления движений в документе? Чем позже начинаешь блокировать данные, тем лучше.
#71 by MadJhey
Похоже при обращении к осн. таблице документа заказы ты блокируешь ее всю. План запроса в профайлере умеешь делать? Лучше сделать отдельный регистр сведений, подчиненный регистратору, и в нем сохранять контрагента при проведении. Запрос переписать.
#72 by MadJhey
В регистре сведений поставить индексацию по полям поиска запроса: подразделение, контрагент, дата. Конструкцию не в (выбрать...) переписать на левое соединение и условие есть NULL.
#73 by YAGolova
левое соединение лучше чем не в?
#74 by MadJhey
оптимизатор SQL не знает сколько вернется значений и не может использовать индекс. В результат сканирование и перебор всей таблицы. На самом деле и  с "не" та же история.
#75 by YAGolova
спасибо за совет, попробую с соединением
#76 by MadJhey
Регистр сведений нужен. Иначе, что мертвому припарка.
#77 by MadJhey
Как насчет ?
#78 by YAGolova
удалять автоматически - но движений там всего 2 регистра
#79 by MadJhey
значит они весят заблокированными с начала проведения и никто не может к ним обратиться, пока документ не будет проведен. Лучше переделать на "Удалять автоматически при отмене проведения". Очистку движений делать как можно позже. Имеет смысл прикрутить анализ ожиданий на блокировках  гилева, благо он бесплатный. . Правда ему нужен режим совместимости выше 8.2.13. Ну или ЦУП :). Там четко видно кто блокирует, что блокирует и сколько по времени блокирует.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С