Курс по Оптимизации 1С — Занятие №10
В рамках этого занятия необходимо изучить следующие материалы.
Модуль 3. Причины медленной работы
- Глава 8. Анализ причин медленной работы и оптимизация системы
- Основные причины избыточных блокировок
- Влияние автоматического режима на избыточные блокировки
- Влияние неоптимальных запросов на избыточные блокировки
- Методические ошибки приводящие к избыточным блокировкам
- Блокирующее чтение в начале транзакции
- Влияние режима удаления движений на параллельность работы
Практические задания
К сожалению, у Вас недостаточно прав для дальнейшего просмотра.
Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.
Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.
Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.
Комментарии / обсуждение (199):
Комментарии закрыты

Если используется управляемый режим блокировок и новая методика контроля остатков по регистру с разделением итогов в 8.3 (без установки БлокироватьДляИзменения = Истина), взаимоблокировки ведь не будет?
В СУБД работает режим READ COMMITTED SNAPSHOT, при котором S-блокировка в СУБД на время чтения не устанавливается. В 1С неявная S-блокировка при чтении запросом не устанавливается никогда.
Получается, что если не устанавливать свойство БлокироватьДляИзменения, возможно образование отрицательных остатков в 8.3! В 8.2 же их образование невозможно из-за срабатывания взаимоблокировки. Т.е. в 8.3 при таком сочетании исходных данных необходимо всегда устанавливать свойство БлокироватьДляИзменения.
…
(текст комментария доступен только участникам Мастер-группы)
вопрос по заданию 23
у меня блокировка возникает на основной таблице регистра. Разве она не должна быть на таблице итогов?
проверял по ТЖ.
45:11.067002-19999988,TLOCK,4,process=rphost,p:processName=Baza1,t:clientID=106,t:applicationName=1CV8C,t:computerName=sum,t:connectID=23,SessionID=60,Usr=DefUser,AppID=1CV8C,Regions=’AccRg83.DIMS,AccRg83.DIMSAUX’,Locks=’AccRg83.DIMS Exclusive Correspond=0 Period=[T»20151001000000″:+] Account=70:85c1b4b52f75a60311e56d8af2a8fb53 ExtDimension1=71:85c1b4b52f75a60311e56d8af2a8fb52 Fld84=77:85c1b4b52f75a60311e56d8ae94b20e1,AccRg83.DIMS Exclusive Correspond=1 Period=[T»20151001000000″:+] Account=70:85c1b4b52f75a60311e56d8af2a8fb54 ExtDimension1=71:85c1b4b52f75a60311e56d8af2a8fb52 Fld84=77:85c1b4b52f75a60311e56d8ae94b20e1,AccRg83.DIMSAUX Exclusive Correspond=0 Period=[T»20151001000000″:+] Account=70:85c1b4b52f75a60311e56d8af2a8fb53 Fld84=77:85c1b4b52f75a60311e56d8ae94b20e1,AccRg83.DIMSAUX Exclusive Correspond=1 Period=[T»20151001000000″:+] Account=70:85c1b4b52f75a60311e56d8af2a8fb54 Fld84=77:85c1b4b52f75a60311e56d8ae94b20e1′,WaitConnections=22,Context=’Форма.Записать : Документ.Приходная.ФормаОбъекта
Документ.Приходная.МодульОбъекта : 14 : Движения.Хозрасчетрый.Записать();’
…
(текст комментария доступен только участникам Мастер-группы)
Поясните пожалуйста решение задания 23, первая строка в первой таблице решения. «НЕТ» потому что «мешает» таблица итогов? Не смотря на то, что наборы измерений в операциях не полностью идентичны?
Задание 25. Первые две строки — причина в минимальной гранулярности блокировки?
Задание 28. в условии написано «Измерения регистра не проиндексированы.», но у таблицы итогов регистра накопления есть индекс «Период+Измерение1+…+Измерение N». Если в условие запроса добавить период — индекс регистра будет использоваться?
Правильно я понимаю что при чтении запросом в транзакции уровень изоляции «REPEATABLE READ»?
Насколько я понял по 28 заданию, в упр режиме блокировка снимется после выполнения запроса, а в авторежиме — после окончания транзакции. Это так?
Слегка запутался в блокировках. Есть какая либо сводная таблица, кто-кого блокируеет и как различается поведение в упр и авто режимах?
…
(текст комментария доступен только участникам Мастер-группы)
Отличная таблица, что-то проясняет а что-путает. 2-3я строки с низу, блокировки накладываются и в 2с и в субд одновременно? Или в зависимости от каких то факторов?
Запрос вида «Выбрать Товар.Наименование из Справочники.Товары где товар.ссылка = &ссылка» не будет блокировать объект &ссылка так как он не возвращает никаких объектных данных?
Вы уже не первый раз упоминаете про «обновленный курс», мы сможем увидеть его материалы (те которые отличаются от текущего варианта)? Слайды без ошибок, и с этой таблицей. Может ещё что-то есть о чем не знаем.
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, пожалуйста, поясните содержание графы Длительность в новой таблице для автоматического режима: «Объектные данные блокируются до конца транзакции»-это понятно, но вот дальше «,только если запрос возвращает эту строку, иначе блокировка снимается, не дожидаясь конца транзакции» — здесь непонятно. Не могу точно указать место, но неоднократно прозвучало, что запрос блокирует не возвращаемые данные, а используемые.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо
Добрый день!
В сборнике задач «проф. по технологическим вопросам» есть вопрос «Каковы возможности по параллельной записи для наборов записей регистра накопления (оборотов)? Разделение итогов выключено. Используются текущие итоги. Режим управления блокировками — управляемый.»
Решил проверить на практике эту ситуацию, но не тут то было.
Для оборотного регистра вообще ничего не активно (рис).
Вопрос каким образом можно включить использование текущих итогов и какой их смысл для оборотного регистра.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо! Буду иметь в виду)
Добрый день!
1. Пробую увидеть в ТЖ управляемые блокировки. Платформа 8.3.6.2076.
Происходят странные вещи: информация попадает в логи, только если ставлю точку останова.Пробовал из внешней обработки и из модуля проведения накладной. Если точку останова не ставлю, то записи в логах не появляются, как только поставлю на любое время, то все начинает писаться. Можете прокомментировать?
2. Если я правильно понял в упр. режиме при чтении запросом управляемая блокировка на сервере 1с не ставиться, но данные на уровне СУБД все- равно блокируются, причем при выполнении запроса СУБД захватывает все записи обрабатываемые запросом. Пытаюсь воспроизвести практическое задание, ставлю точку останова на строке Запрос.выполнить(). При этом запрос идет с частичным сканированием и по идее на уровне СУБД должна установится S блокировка практически на весь регистр, но при этом из второй сессии спокойно проводятся документы по этому регистру. Отсюда напрашивается вывод что S блокировка на уровне СУБД не случилась или я в конец запутался). Прошу подсказать в чем моя ошибка.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо за ответ.
в первом случае действительно все так и было, куча каталогов rphost.
Но во-втором случае ваш совет пока не помог.
Поставил совместимость с 8.2. Но картина осталась той же.
Я уже пробовал и с другой стороны зайти. Ставил точку останова в модуле проведения документа. Таким образом железно устанавливается X блокировка (на 2 склада и товар), но обработка без проблем считывает данные запросом, без разницы какой товар, хоть даже и тот что в документе.
Правильно ли я понял что недокументированная особенность что «при чтении запросом управляемая блокировка на сервере 1с не ставиться» относится только к упр. режиму версии 8.3.
…
(текст комментария доступен только участникам Мастер-группы)
Запрос в транзакции само собой).
В транзакции №1 ставлю точку останова на строке запрос.выполнить() , В транзакции №2 ставлю точку после записи регистра.
У меня по ходу появился еще один вопрос, возможно из-за этого и так ведет себя система:
Почему в плане запроса Clustered Seek Where? Вроде бы по теории раз оба измерения не проиндексированы, то оптимизатор должен был бы выбрать полное сканирование?
Частичное сканирование происходит в обоих случаях: если условие на второе измерение и условие на оба измерения.
При этом независимо от версии платформы происходит следующее:
1) Если условие и на склад и на товар, то таймаут случается только при условии если в документе склад равен складу выбранному в обработке.
2) Если в обработке задать условие на товар, то блокировки не происходит, то есть из второй транзакции спокойно проводятся документы с этим товаром в ТЧ.
…
(текст комментария доступен только участникам Мастер-группы)
База та что прилагается к курсу https://yadi.sk/d/QeLtN4QWjEkSi
обработка https://yadi.sk/d/xqum_Ew-jEkUv.
Прошу прощения за свое сообщение от 21.09.15 так как я в обработке поставил явную блокировку и забыл убрать, поэтому получил такие результаты.
Конфигурация совместима с 8.2.13.
На данный момент результаты тестирования следующие.
1) В Упр. режиме в обработке выбираю «стул», ставлю точку останова в на строке Запрос.выполнить(). При этом во второй сессии спокойно провожу вообще любые продажи (со стульями и без).
2) Такая же ситуация и в автоматическом режиме.
3) Делаю наоборот: Провожу Упр. режиме в транзакции №1 документ «Продажа», в котором есть например тот же стул. Ставлю точку останова после записи регистра. Но в транзакции №2 обработка спокойно считывает данные запросом.
4) И только если проделать манипуляции из п.3 в автоматическом режиме наконец-то случается ошибка по таймауту.
Понимаю что что-то делаю не так. Например при попытке воспроизвести ситуацию из уроке 15 «Связь между блокировкой и запросом.Пример» случается блокировка только в автоматическом режиме.
И еще один пару вопросиков.
1) На учебной базе, если задать условие только по второму измерению, план запроса с оператором Clustered Seek Where. Я запускал эту же обработку на других тестовых базах, в этих случаях план запроса использовал операторы Clustered Index Scan. C чем это может быть связано?
2) При выполнении запроса в авт. режиме в плане запроса виден уровень изоляции (Serializable), при выполнении запроса в упр. режиме вообще нет никакой информации. (No lockа также нет). Это так и должно быть?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый вечер!
В Профе по эксперту есть следующий вопрос:
При включении использования текущих итогов параллельность записи наборов регистров бухгалтерии и накопления (остатков), отличающихся только периодом (месяцем) в управляемом режиме управления блокировками (разделение итогов запрещено): Прекращается.
Т.е., если текущие итоги не включены, (разделение итогов выключено), то получается возможно параллельная запись одинаковых измерений, если отличаются периоды?
В курсе было сказано, что при внесении изменений в регистр остатков, обновляется таблица итогов, т.е. по текущему набору измерений блокируются все строки со всеми периодами.
Вопрос — почему при выключенных текущих итогах можно записывать (можно ли или всё-таки нет?) параллельно данные с одинаковым набором измерений и разными периодами? Как меняется поведение системы, если мы выключаем текущие итоги? (Насколько я понимаю, просто не будет актуализироваться текущий итог на 5999 год и всё, других отличий быть не должно. Но в этом случае ведь параллельная запись одинаковых измерений с разным периодом должна быть невозможна — т.к. обновляется таблица итогов на каждый месяц).
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, в одном из ответов на дополнительные вопросы (вопрос 11) есть такая фраза:
Для Автоматического режима:
В самом начале проверки выполняем запрос с опцией «Для изменения» и
условием на имя элемента.
Таким образом, если элемента еще нет, то мы его заблокируем, и никто кроме
нас не сможет создать элемент с тем же именем.
Я проверил данный момент, но в действительности, если элемента нет, то можно запросто создавать элементы в параллельной транзакции с таким же наименованием. Т.е. получается, что СУБД не блокирует возможность в параллельной транзакции создать вроде бы как «заблокированный» несуществующий элемент…
Не могли бы прокомментировать данный момент?
Спасибо.
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, а в итоге как решить данную проблему для Автоматического режима? Как ответить на данный вопрос на экзамене?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
Вопрос про эскалацию блокировок на уровне СУБД.
В книге по Эксперту сказано следующее:
Если в момент попытки эскалации на СУБД MS SQL кто-то другой будет держать блокировку, то эскалации не произойдет, при этом транзакция дальше продолжит своё выполнение.
Я это понял следующим образом:
Если в транзакции было принято решение выполнить эскалацию блокировок до таблицы, но при этом есть блокировки, установленные на отдельные записи другими транзакциями, на уровне СУБД эскалации не будет, а будет блокировка на уровне записей большого количества строк. При этом транзакция успешно завершается.
А на уровне 1С в такой ситуации — «эскалирующаяся» транзакция получит таймаут в случае ожидания более 20 сек.
Верно ли я всё понял?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день.
Андрей, по поводу видео про свойства транзакций, управляемые блокировки и удаление движений документов:
Если такая ситуция:
В конфигурации документ ПродажаТоваров формирует движения по регистру накопления СебестоимостьПартиТоваров(и по каким то другим еще).
Измерения регистра — Товар, Партия, ресурсы Количество и Себестоимость. В процессе проведения производится расчет себестоимости по партиям.
Есть документ ПродажаТоваров №1 у него есть какие товары в таб.части и он проведен.
В процессе редактирования пользователь удаляет из таб.части все эти товары из заполняет таб.часть совершенно иными товарами и пытается перепровести этот документ.
Предположим что другой пользователь создал документ ПродажаТоваров №2 и заполнил таб.часть теми товарами которые совпадают с товарами из набора записей регистра накопления
СебестоимостьПартиТоваровдокумента ПродажаТоваров №1.
В процедуре ОбработкаПроведения есть контроль остатков — как положено товары из таб.части блокируются явной управляемой блокировкой на этот случай.
Допустим ПродажаТоваров №1 и ПродажаТоваров №2 проводятся параллельно, но ПродажаТоваров №1 не провелся по причине нехватки какого то товара, а второй провелся.
В этом случае произойдет откат транзакции документа ПродажаТоваров №1 и его набор записей регистра накопления СебестоимостьПартиТоваровдокумента вернется в прежнее состояние, таким образом произойдет попадание погрешности в расчет себестоимости по данному регистру.
Однмими из свойств транзакции являются — надежность и согласованность, следовательно такое поведение системы не допустимо.
В видеоуроках в про удаление движений говорилось, что если стоит «Удалять движения автоматически» то будет автоматически наложена управляемая блокировка на наборы записей,
однако вы рекомендовали использовать «Удалять автоматически при отмене проведения», но если я правильно понял видео то в этом случае не будут заблокированы наборы записей.
В типовых конфигурациях я не видел(мб не заметил) чтобы защищались наборы записей партионных регистров накоплений от таких коллизий. И на экзамене 1С специалист по платформе
я не заморачивался подобными вопросами, экзаментор также по этому поводу ничего сказал.
В связи с этим вопрос — в процессе транзакции проведения платформа каким то образом защищает наборы записей от подобных ситуаций в управляемом режиме блокировкой данных?
Или нужно для таких случаев специально накладывать управляемую блокировку?
Когда решал задачи экзамене 1С специалист по платформе использовался такой прием в коде: «Движения.ИмяРегистра.Записать();». Таким образом записывается пустой набор записей,
при настрйоке документа «Удалять автоматически при отмене проведения».
Мб на этом этапе производится блокировка набора записей?
Андрей, а как бы вы защитили партионные регистры от таких коллизий?
…
(текст комментария доступен только участникам Мастер-группы)
1. Вы предлагаете хорошую идею.
2. Насколько я помню видео про свойства транзакций — свойство согласованность является спорным/неоднозначным и частично обеспечивается прикладным кодом — вы приводили пример про перемещение товаров с одного склада на другой, что как раз обеспечивается работой прикладного кода. И если в прикладном коде есть ошибка разве эксперт не должен на это обращать внимание?
3. В качестве защиты мб имеет смысл прикрутить последовательности. Кстати это скорее всего также решит и мою проблему и ту которую вы описали.
«Кстати документы у вас параллельно не должны проводиться (разве только разделение итогов включено). Источник: ©Курсы-по-1С.рф» — почему не должны?
ПродажаТоваров1 — в таб.части проведенного документа до редактирования указан товар1, а после редактирования и в момент повторного проведения указаны товар2 и товар3.
ПродажаТоваров2 — в таб.части нового проводимого документа товар1.
Разве явная упр блокировка в этом случае должна помешать параллельному проведению этих документов, если ее источником данных является табличная часть?
По идее и БлокироватьДляИзменения не должно помешать, вне зависимости от того стоит ли разделение итогов.
4. Выходит не имеет смысл блокировать данные наборов записей проводимого документа?
…
(текст комментария доступен только участникам Мастер-группы)
Не могу разобраться.
Конфигурация в управляемом режиме. Есть регистр сведений непериодический, без регистратора, с двумя измерениями.
Ставлю в коде исключительную БлокировкуДанных по двум измерениям. В транзакции.
Если поставить после этого точку останова и в другом сеансе с помощью запроса выбрать данные — заблокированные блокировкой данные тоже выбираются. Хотя не должны.
Транзакция активна в момент точки останова. В технологическом журнале тоже данные пишутся о факте блокировки.
Так должно быть? Ведь X (исключительная блокировка) и S (блокировка запросом) не совместимы.
…
(текст комментария доступен только участникам Мастер-группы)
При попытке запустить Сценарное тестирование — возникает следующая ошибка:
«Следующие ВРМ не удалось подготовить до истечения таймаута подготовки (180 сек.):
— 2 x Оператор 1 [Иванов] на LILIYA »
В чем тут может быть причина?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
Все никак не могу понять следующее. Например, если у нас происходит сканирование, то везде говорится, что это плохо по 2 причинам:
1) увеличивается время выполнения запроса
2) возникают избыточные блокировки
Пункт 1 ясен. Не ясен 2. Вся таблица блокируется что ли? Или как? Будут ли избыточне блокировки, если в WHERE указаны разные условия? Проясните, пожалуйста, этот момент.
…
(текст комментария доступен только участникам Мастер-группы)
2. Если это автоматический режим, то поведение такое же, как вы описали в пункте 3, но с разницей в том, что блокировка держится до конца транзакции? Или же блокируется вся таблица (все считанные строки независимо от того подходят они под условие или нет)?
///////////////
> Непонятен вопрос «в WHERE указаны разные условия», что имеется ввиду?
Тут я имел ввиду вот что. Могут ли выполняться одновременно 2 запроса такого вида:
select * from mytable where column1=»one»
и
select * from mytable where column1=»two»
Но вопрос возникал потому, что у меня были мысли (в автоматическом режиме это ещё открытый вопрос), что на время выполнения запроса блокируется вся таблица.
…
(текст комментария доступен только участникам Мастер-группы)
Ещё одно небольшое уточненение по (2). Я правильно понимаю, что такое поведение характерно и не для 1С систем, если уровень изоляции транзакции стоит Serializable?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
«1. Запросы со сканированием блокируют данные, только если они выполняются в транзакции иначе они никого не блокируют, просто загружают оборудование и долго выполняются.
2. Если это автоматический режим блокировок, то будет заблокирована вся таблица до конца транзакции. Это является избыточной блокировкой, исключение только одно — вам действительно нужна была вся таблица. Источник: ©Курсы-по-1С.рф».
Если в транзакции запрос заблокировал всю таблицу могут ли запросы вне транзакции получать доступ к заблокированным данным? Это может зависеть от режим управления блокировкой данных?
…
(текст комментария доступен только участникам Мастер-группы)
Видео 85. Контроль остатков по регистру с разделением итогов и БлокироватьДляИзменения=Истина.
У вас на схеме блокировок написано «Установить X блокировку». Создается впечатление, что X блокировка ставится на уровне СУБД на таблицу итогов без учета разделителя, но это же не верно? По моему разумению, на уровне СУБД останется та же X блокировка с учетом разделителя, но на уровне 1С поставится исключительная управляемая блокировка на набор измерений регистра без учета разделителя. И другая транзакция, пытаясь установить управляемую блокировку на пересекающийся набор измерений вынуждена ждать. Поправьте пожалуйста, если я не прав.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо.
Видео 84. Контроль остатков по регистру с разделением итогов и БлокироватьДляИзменения=Ложь.
Правильно ли я понимаю, что в случае 8.3 и Read Commited Snapshot проблемы взаимоблокировок не возникнет, но возникнет проблема отрицательных остатков?
И попутный вопрос. В курсе не рекомендуется использовать платформу 8.3, а использовать 8.2. Данная рекомендация еще актуальна?
…
(текст комментария доступен только участникам Мастер-группы)
Андрей добрый день!
Ты говоришь, что при использовании ВыбратьИзменения() при выгрузке данных блокируется вся таблица регистрации целиком.
Вопрос 1:
Правильно ли использовать следующую схему для ускорения этого процесса?
1. Запросом читаем данные по изменениям (Документ.Заказ.Изменения), плюс в моем случае требуется дополнительно отфильтровать данные, выгружать не все.
2. При обходе запроса выгружаем полученные данные, формируем Массив, все выгруженные данные добавляем туда.
3. Используем ВыбратьИзменения(Массив) для того, чтобы проставить номера сообщений в таблице регистрации.
Вопрос 2:
Как я понимаю, вполне резонно ограничивать итерацию выгрузки каким-то небольшим количество данных, например 100 объектов?
Вопрос 3:
Правильно ли, что ВыбратьИзменения(Массив) будет блокировать таблицу регистрации не полностью, а только по данным из массива?
Вопрос 4:
Правльно ли, что при использовании «Выборка = ВыбратьИзменения()» вне транзакции будет наложена Х блокировка на уровне СУБД и будет длиться, пока существует переменная Выборка? Если тут какая-то разница при использовании Управляемого/Автоматического режима блокировок?
Заранее спасибо.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо за ответы, попробуем…
Доброй ночи, Андрей,
подскажите, пожалуйста, на тему режимов удаления движений, если перепроводить документ, меняя в нем значения ресурсов или измерений, то неважно какой режим стоит (давайте не будет брать здесь в пример «Удалять автоматически», т.к. с ним все понятно, возьмем два других), данные в РН все равно обновляются, что тогда в этом случае делает система, если не удаляет движения?
…
(текст комментария доступен только участникам Мастер-группы)
Понятно, спасибо большое. Получается «Удалять автоматически» не имеет смысл использовать в принципе. «Удалять автоматически при отмене проведения» кажется идеальным вариантом.
И еще вопрос, правда уже по пройденному: хорошо запомнил рекомендацию по использованию функции ВЫРАЗИТЬ для полей составного типа, но вот тут появился вопрос, если нам нужно получить остаток по конкретному документу, ссылка на который лежит в поле составного типа, например:
ВЫБРАТЬ
Остатки.ЗаказКлиента КАК Ссылка,
Остатки.СуммаОстаток КАК Остаток
ИЗ РегистрНакопления.ОстаткиТоваров.Остатки(,ЗаказКЛиента = &ВыбранныйДокумент) КАК Остатки
В данном случае применения выразить в выбираемых полях достаточно:
«ВЫРАЗИТЬ(ЗаказКлиента как Документ.ЗаказПокупателя)»
или нужно добавить «ВЫРАЗИТЬ» и в условие виртуальной таблиы:
ВЫРАЗИТЬ(ЗаказКЛиента КАК Документ.ЗаказПокупателя) = &ВыбранныйДокумент»
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день.
Анализирую запросы в ЦУПе. Обратил внимание на то, что при выполнении запросов, ЦУП говорит, что возникают блокировки (вкладка блокировки). При этом я точно знаю, что запросы выполняются вне транзакции. Так же в самих запросах вижу WITH (NOLOCK). Откуда берутся блокировки?
…
(текст комментария доступен только участникам Мастер-группы)
Нужно было приложить скриншот. Прилагаю скрин. Это запрос из динамического списка. Откуда блокировки?
//***
И возник ещё один вопрос. При анализе запросов, я обратил внимание, что если в 1С используются временные таблицы, то в ЦУП-е в запрос попадает только первый запрос, который формирует саму временную таблицу, т.е. например:
INSERT INTO #tt55 (_Q_000_F_000, _Q_000_F_001RRef)
SELECT
…
Хотя в 1С в запросе формируется временная таблица из которой потом выбираются данные. И по запросу в ЦУП-е я вижу, что это именно формирование временной таблицы. А последующей выборки там нету. Это нормально?
Скрин забыл.
…
(текст комментария доступен только участникам Мастер-группы)
> Пришлите dt базы ЦУП, сейчас ничего не понятно.
http://www.ex.ua/600818968130
> Запросы попадают в ЦУП с фильтром по длительности, если выборка из временной таблицы была быстрой, в ЦУП запрос не попадет.
Т.е. если есть 1 пакетный запрос, состоящий из нескольких, то ЦУП оценивает отдельно каждый запрос входящий в пакет, а не весь пакет целиком?
…
(текст комментария доступен только участникам Мастер-группы)
1. http://rghost.ru/7FBwlkrW2
2. Понял, спасибо!
…
(текст комментария доступен только участникам Мастер-группы)
У меня нет кнопки «Ответить» под вашим сообщением выше, поэтому тут напишу. Спасибо за ответы!
Добрый день, Андрей!
У меня: MS SQL 2012, режим блокировок -управляемый, разделения итогов — нет.
Процесс 1 выполняет «длинный» запрос (соединение остатков по определенным измерениям с другими таблицами с помощью декартового умножения). Процесс 2 добавляет записи в регистр остатков с теми же измерениями.
Процессы без проблем работают параллельно. Хотя,
Логика подсказывает что блокировка СУБД на время выполнения запроса обязана быть, но она никакими (известными мне) методами не отлавливается (Monitor Activity, например, показывает что происходит запрос и асинхронное чтение, но про блокировки — ничего). В пользу того что блокировка СУБД (хоть какое то время) присутствует говорит то факт, что, например, результат ресурса «остаток» в ходе выполнения запроса не меняется (а физически вторым процессом он таки меняется).
Мучает вопрос: Что же там такое делается? :)
…
(текст комментария доступен только участникам Мастер-группы)
Автоматический режим и типовые конфигурации.
Глянул не несколько типовых конфигураций последние релизы:
1.УТ 10.3. Режим конфигурации Автоматический. Глобальный поиск по слову «БлокировкаДанных» нашел около 10 вхождений и то кое-какую ерунду. В документах или процедурах списания остатков, например, этих слов я не увидел. Значит блокировки там не накладываются. В УТ 10.3 исторически всегда использовалась старая модель контроля остатков.
Правильно я понимаю, что эта конфигурация не «заточена» под управляемые блокировки? И если есть клиенты, кому нужно перевести эту конфигу на управляемый режим, это делать надо самостоятельно.
А значит анализировать каждый документ (согласно уроку 9) и где необходимо защищать данные, самому ставить управляемые блокировки в модулях. Т.е. по сути вникать в каждый запрос, каждый документ. А их там много (((
А это по-сути целый проект по адаптации конфигурации под управляемый режим.
2.КА 1.1 Режим конфигурации стоит Управляеый. Но поиск по слову «БлокировкаДанных» также нашел только 14 вхождений. У документов или процедур списания таких слов я не видел. Можно ли здесь сделать вывод, что КА 1.1 не адаптирована нормально по управляемый режим?
3.УТ 11.1 Поиск по слову «БлокировкаДанных» нашел 440 вхождений. Вот здесь вижу, что в конфигурации много где (в том числе и в документах) устанавливаются блокировки. Значит разработчики поработали над защитой данных.
…
(текст комментария доступен только участникам Мастер-группы)
Есть с методической точки зрения принципиальная разница между использование старой методики, но с явной установкой блокировки (естественно, только нужные данные), и новой методикой?
Мне кажется, что принципиальной разницы нет, и там и там блокируем только то что нужно и сразу накладываем Х-блокировку. Просто немного разными способами. И тот и тот алгоритм должен одинаково защищать данные что в автоматическом, что в управляемом режиме.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день. Очередная порция вопросов от меня:
1. Модуль 3, видео «19 Реализация блокировок в СУБД». Есть вопросы по колонкам:
— «Пользователь» — это ведь не имя пользователя в 1С? Что это? Это ID какого-то сеанса, который создает сервер 1С (под одним конкретным пользователем) к серверу БД?
— «ID ресурса» — это ID какой-то конкретной записи или это какой-то хеш, который может в себе содержать совокупность каких-то записей? Если совокупность записей, то там могут быть только записи из одной таблицы или из нескольких?
2. Модуль 3, видео «21 Эскалация на управляемых блокировках». Это имеется ввиду блокировки не на уровне СУБД, а на уровне сервера 1С? И вообще сам термин «управляемые блокировки» — это как раз таки подразуменвает именно блокировки на уровне сервера 1С, а не СУБД?
3. Модуль 3, видео «39 Автоматический режим». Вы демонстрируете избыточные блокировки за счет излишних блокировок в диапазоне, за счет проведения документов с разными данными. Вопрос: как вы узнали, что данные во втором проводимом документе будут в индексе граничить с данными первого проводимого документа?
4. Модуль 3, видео «53 Блокировка на всю таблицу». Вы тут говорит 5000 блокировок. Помимо этого вы и в других видео говорите подобные вещи, но я это не до конца понимаю. Т.е. 1 блокировка всегда это одна строка в таблице? Т.е. не может быть на уровне СУБД или сервера 1С 1 блокировка, которая блокирует 5000 строк?
5. Модуль 3, видео «57 Установка неявных управляемых блокировок. Пример». Вы говорите, что в индекс регистра входит период + измерения. Далее демонстрируете таймаут на блокировке при проведении 2 разных документов со схожими данными измерений, но которые относятся к разным месяцам. Т.е. период у них разный. Почему возникает ожидание?
6. Модуль 3, видео «59 Внутреннее устройство управляемых блокировок. Пример». Если мы блокируем какой-то список товаров на каком-то списке складов в регистре, то в таблице количество строк будет КоличествоТоваров * КоличествоСкладов, или же будет 1 строка где в полях будет храниться «список значений»?
7. Есть документ, в табличной части которого находятся Номенклатура и Склад. Хочу заблокировать соответствующую номенклатуру на соответствующих складах, т.е. например: стул на складе1 и стол на складе2.
Если я напишу так:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(«РегистрНакопления.ТоварыНаСкладах»);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = ДокументОбъект.ТабличнаяЧасть;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Склад», «Склад»);
Блокировка.Заблокировать();
то у меня заблокируется то, что я хочу (на картинке вариант 1) или же заблокируется записи стул и стол на складе1 и складе2 (на картинке вариант 2)?
8. Есть у нас регистр накопления с измерениями Товар и Склад (именно в таком порядке). Есть ли разница если я укажу в запросе условие
Товар = &Т и Склад = &С
и
Склад = &С и Товар = &Т
?
Кто-то (оптимизатор?) поймет, что при втором варианте можно так же как и при первом использовать индекс?
9. Когда мы говорим о блокировках и говорим, что блокируются строки, где именно блокируются строки: в таблице с данными или в индексе?
10. На скриншоте приведена картинка из монитора производительности. На нем видно, что есть ожидания, причем колонки Вlocked By и Session ID совпадают, т.е. получается, что пользователь блокирует сам себя? Как так получается?
11. В ЦУПе когда на показатель «Анализ запросов» ставится фильтр, чтобы отлавливать запросы более чем Х секунд, вот эти Х секунд как-то связаны с показателем «Анализ ожиданий на блокировках»?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо! Большинство вопросов прояснились. Но по некоторым всё же осталось недопонимание.
5. Я накидал простенькую конфу с документом Приходная накладная и регистром Остаки (вид регистра Остатки). Документ, соответственно, пишет туда данные. Провожу один документ сегодняшним числом, после этого провожу документ 1.05 и ещё один 1.04. При проведении какого-то документа прошлого месяца запускаю SQL Profiler и смотрю какие запросы поступают на СУБД. Из запросов, связанных с регистром я нахожу только вставку записи в основную таблицу
exec sp_executesql N’INSERT INTO _AccumRg27 (_Period,_RecorderRRef,_LineNo,_Active,_RecordKind,_Fld28RRef,_Fld29RRef,_Fld30)
VALUES(@P1,@P2,@P3,@P4,@P5,@P6,@P7,@P8)’,N’@P1 datetime2(3),@P2 varbinary(16),@P3 numeric(9),@P4 varbinary(1),@P5 numeric(1),@P6 varbinary(16),@P7 varbinary(16),@P8 numeric(10,2)’,’4015-05-01 12:00:00′,0xA9A1005056A778A111E50DE0A3FE8961,1,0×01,0,0x00000000000000000000000000000000,0xA9A1005056A778A111E50DDCB5BC85BA,11.00
и обновление текущих итогов
exec sp_executesql N’UPDATE T1 SET _Fld30 = T1._Fld30 + @P1
FROM _AccumRgT31 T1
WHERE T1._Period = @P2 AND T1._Fld28RRef = @P3 AND T1._Fld29RRef = @P4′,N’@P1 numeric(10),@P2 datetime2(3),@P3 varbinary(16),@P4 varbinary(16)’,11,’5999-11-01 0:00:00′,0x00000000000000000000000000000000,0xA9A1005056A778A111E50DDCB5BC85BA
В то же время в таблице итогов в базе данных действительно находится только 1 строка с текущими итогами. Не пойму, а где итоги за апрель и за май?
9. А если индекса нету или СУБД решило его не использовать, а просто просканировть таблицу, то всетаки блокируются строки именно в таблице или же СУБД использует для этого что-то другое?
11. Я почему задал вопрос. Сейчас я мониторю запросы ЦУПом с временем выполнения более 5 секунд. Так же я включаю сбор показателя «Анализ ожиданий на блокировках». В результате запросы я ловлю, а ожиданий нету. Для того, чтобы поймать ожидания, мне нужно убрать фильтр на длительность выполнения запросов?
…
(текст комментария доступен только участникам Мастер-группы)
9. А если это не 1С? Возможно, вопрос на практике бестолковый, но у меня к нему академический интерес.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо за ответы!
Здравствуйте!
В таблицах констант есть поле _RecordKey. В документации сказано что оно нужно для «правильной установки транзакционных блокировок». Не подскажете, почему без него блокировки установятся неправильно и почему его значение равно 31?
…
(текст комментария доступен только участникам Мастер-группы)
Если будет включено разделение итогов у регистра, то при автоматическом удалении движений в начале транзакции — будет ли избыточная блокировка таблицы остатков регистра? Или заблокируются только строки по определенному разделителю? (89 видео)
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день! Лучшим методом избегать избыточных по времени блокировок при записи большого количества данных является «дробление» транзакции на порции. Понятно как это сделать при явной транзакции. Что делать, если транзакция неявная — например, в обработке проведения многострочного документа? Ведь транзакция начинается с началом ОбработкиПроведения и как только мы пишем первую строку в первый регистр, начинают накапливаться блокировки, а транзакция завершится только с завершением проведения.
В большинстве случаев большие объемы данных меняются именно документами.
…
(текст комментария доступен только участникам Мастер-группы)
А может прокатить вариант когда мы Не Записываем движения в проведении(Или Записываем но только самые необходимые), а потом добавляем их порционо указывая регистратором документ фоново.(Своего рода отложенное асинхронное проведение). Просто проведение документа не отличается от записи в регистры обработкой. Единственно Нам придется ручками отслеживать все плюсы транзакции как не делимость защищенность и тд.
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, можно еще вопрос, в курсе есть информация, как посмотреть кто кого заблокировал. А как посмотреть, кто какие блокировки наложил?
…
(текст комментария доступен только участникам Мастер-группы)
Почему при выгрузке по плану обмена устанавливается неявная блокировка или имеется в виду выгрузку по плану обмена в случае когда мы явно прописываем начать транзакцию? Какие блокировки при выгрузке по плану обмена накладываются СУБД или управляемые? Если мы выгружаем по плану обмена без транзакции, что тогда?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо, кстати этой информации нету ни в настольной книге эксперта, ни на итс
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, добрый день!
Урок «97 Кто кого заблокировал. SQL Profiler.» При попытке воспроизвести ситуацию как описано в уроке, блокировка в SQL Profiler показывается только, если в конфигурации установлен режим управления блокировкой данных «Автоматический». Если поменять на «Управляемый», в SQL Profiler строка с блокировкой не появляется. Почему так может быть? Документ проводится по новой методике «списание-проверка».
…
(текст комментария доступен только участникам Мастер-группы)
Вопрос про последовательность. Регистрировать документы в последовательности регламентным заданием в нерабочее время, это как, я не могу себе представить реализацию такого решения. Насколько я знаю, в типовых документы вообще не сдвигают границу последовательности, а просто регистрируются в ней в момент проведения, при этом используется измерение ПроведенВХронологическомПорядке.
…
(текст комментария доступен только участникам Мастер-группы)
Предположим, мы делаем запись в двух регистрах по одному набору измерений в двух транзакциях так, что возникает таймаут. Если используются упр. режим, то блокировки будут наложены как на сервере СУБД, так и на сервере приложений. По идее, таймаут возникнет тоже в двух местах. Где в таком случае мы получим ошибку вперед на 1с или на СУБД?
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, доброго времени суток.
Вопрос по решению 23 задания: самая первая строка в таблице, где двумя транзакциями пишем движения по одному счету, организации и разными (!) контрагентами по субконто. Поясните, пожалуйста, по возможности, подробнее, почему в примере решения в той таблице, которая относится к варианту «Без разделителя» — указано, что нет возможности провести запись одновременно? Ведь субконто в таблице остатков РБ по факту идёт как отдельное измерение…
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, добрый день!
Хотел уточнить: порядок связей таблиц в запросе влияет ли на выбор оптимизатора оператора плана запроса (сканирование или поиск)?
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, спасибо за курс. Но у меня, по ходу дела, возник вопрос. А кто и когда, собственно, устанавливает блокировки? Почему-то я либо пропустила ответ на этот вопрос, либо о нем не было сказано.
…
(текст комментария доступен только участникам Мастер-группы)
Хорошо. А я, как программист и администратор, могу каким-то образом повлиять на то, будет установлена S-блокировка или U-блокировка?
Верно ли я понимаю, что для того, чтобы установить U-блокировку, мне нужно в коде в транзакции, при чтении объекта указать «Для изменения»?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день! Отчет по 28-му заданию «висит» в модерации уже третий день. Отчет не принят?
Здравствуйте.
Ваш отчет уже принят.
Да. Спасибо. Уже вижу. Только я отвечал на вопрос 28 в такой формулировке:
«В качестве СУБД используется MS SQL Server.
Пользователь А выполняет долгий запрос в транзакции.
Пользователь Б пытается выполнить свой запрос и оказывается заблокированным пользователем
А. Перечислите все известные Вам способы получения информации об этой блокировке.»
А сейчас уже другой вопрос.
Приветствую!
1. Проводил тесты схожие с уроком 78 «Методические ошибки. Регистры».
Если у плана счетов нет ни одного субконто, то результат получается такой же, как и в уроке: ожидание на управляемых блокировках (естественно, при условии что разделитель выключен).
Однако если добавить, например, 1 субконто, ситуация несколько меняется.
В 8.3 я все так же получаю ожидание на упр. блокировках, а в 8.2 уже на блокировках СУБД.
При добавлении субконто появляется дополнительная таблица итогов в базе по счетам и субконто. Но это же не отменяет управляемых блокировок? Режим управляемый, MS SQL 2012, конфигурация вообще пустая с одним документом и регистром. Не понимаю, почему ожидание появляется на СУБД, а не 1С.
2. Вопрос второй связан с разделителем и свойством блокировать для изменения при записи пустых наборов.
Насколько я понимаю, это работает след. образом:
Если идет проведение (т.е. документ НЕ был проведен), то запись пустых наборов не блокирует ничего.
Если идет перепроведение, то запись пустых наборов приводит к блокировке старых движений документа.
По крайней мере в моих тестах это было так.
Интереснее обстоит дело, если включить разделитель итогов.
Случай с первым проведением я не рассматриваю далее, т.к. результат соответствует тестам выше.
А вот при перепроведении в 8.3 с включенным разделителем никаких ожиданий нет. При перепроведении в 8.2 все так же получаю ожидание на блокировках СУБД.
В свое время натыкался на статью Чистова, в которой перед записью пустых движений он советует ставить БлокироватьДляИзменения на набор. Спрашивал Белоусова на этот счет: его мнение было неоднозначно, но он склонялся к тому, чтобы НЕ ставить это свойство на пустой набор.
Учитывая результат моих экспериментов, я немного запутался.
Применительно к записи пустого набора есть ли смысл ставить это свойство? Если да, то в таком случае без этого свойства старые движения будут заблокированы еще и по разделителю, который будет добавлен в момент записи пустого набора, а в случае С этим свойством заблокированы будут все ресурсы по измерениями из старых движений без учета разделителя. Или все совсем не так?
Так же надо полагать, что удаление движений (например, при перепроведении) — это тоже самое, что самому записать пустые наборы?
3. Правильно ли я понимаю, что в 8.3, за исключением явных управляемых блокировок, ожиданий на блокировках для чтения фактически быть не может, т.к. используется версионник и мы просто прочитаем версию объекта до изменения?
4. Возможно ли каким-то образом узнать какой конкретно ресурс (диапазон строк с номерами или id и т.д.) был заблокирован? Т.е. не только знать, какая таблица заблокирована, но и что конкретно в ней заблокировано? Возможно не успею до окончания токена найти ответ на этот вопрос в видео к курсу, поэтому спрошу тут :)
Большое спасибо за ответы.
p.s. Продублируйте пожалуйста ответ на e-mail. Ибо токену 7го числа уже капец :)
…
(текст комментария доступен только участникам Мастер-группы)
По второму вопросу.
Имел ввиду я именно запись — Движения.ИмяРегистра.Записать().
Если схематично представить себе модуль проведения так:
Движения.ИмяРегистра.Очистить() — на всякий случай очищаем в памяти
Движения.ИмяРегистра.Записать() <—— записываем, и вся каша именно об этом
…. какие-то действия в модуле ….
…. заполнение движений ….
Движения.ИмяРегистра.Записать() — запись новых движений.
Например, имеем проведенный документ. Движения по ресурсу 1,2,3. Изменяем в документе данные на 4,5,6. Перепроводим.
В момент записи пустого набора (допустим нам это надо для чтения остатка) мы блокируем старые движения, которые этим пустым набором удалили. При записи новых движений мы заблокируем еще и ресурсы 4,5,6.
Вопрос по факту в том, нужно ли БлокироватьДляИзменения перед записью пустого набора. Как будут заблокированы ресурсы 1,2,3? С учетом разделителя или без?
Позвольте еще один вопрос задать вместе с этим, хоть и не из этого урока.
При сборе данных ЦУПом часто упоминается о том, что данные для анализа мы мониторим короткий промежуток времени.
Что создает наибольшую нагрузку: непосредственно включение логов и их запись или же именно анализ этих данных сильно нагружает систему?
Продублируйте, пожалуйста ответ на почту. Финал первого потока закончен, и резервный доступ точно должен закончится.
Спасибо!
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день.
Сейчас изучаю блокировки и практика не совсем соответствует теории с курса.
База с курса. Платформа 1С:Предприятие 8.3 (8.3.5.1383).
НачатьТранзакцию();
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ
| Товары.РеквизитИндексированный
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.РеквизитНеИндексирован = 2»;
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
ЗафиксироватьТранзакцию();
Когда я считываю данные в этом запросе с фильтром по НЕ индексированным полям регистра сведений, блокируется вся таблица, как и указано в курсе. Но когда я считываю с фильтром по НЕ индексированным полям в справочнике, то блокируются только те записи которые возвращает запрос, а не вся таблица как я ожидал. Может я что то прослушал или не допонимаю?
В первом случае в плане запроса идет сканирование индекса с условием, во втором же случае идет сканирование кластерного индекса с условием, может в этом дело?
…
(текст комментария доступен только участникам Мастер-группы)
Ставлю точку останова на строке зафиксировать транзакцию и во второй сессии пытаюсь изменить справочник либо регистр. В случае регистра я не могу изменить ни одной записи, в случае же справочника я могу изменить любые записи которые не равны условию сканирования
Причем при Index Scan и Index Seek справочника блокируются только поля по которым ищет индекс, т.е. могу изменить наименования элемента справочника, но не реквизит по которому ищет. При Clustered Index Scan и Clustered Index Scan блокируется вся запись, т.е. я не могу вообще ни одного поля изменить.
п.с. сервер 1С:Предприятие 8.3 (8.3.5.1383), но думаю это не имеет значения
п.с. У меня завтра токен заканчивается, если вы мне завтра ответите я наверное его уже не увижу :(
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
Также сталкивался с такой особенностью при автоматическом режиме блокировок. Как известно, при запросе к справочнику будет использоваться уровень изоляции Repeatable Read. Я делал аналогичный запрос, и мои эксперименты показали, что при выполнении запроса СУБД пытается установить S блокировку на все считываемые записи — здесь все, как в теории. Но после выполнения запроса S блокировка остается только по тем записям, которые ВЕРНУЛ запрос, и именно она держится до конца транзакции.
Такая реализация как раз позволяет избежать:
1. Грязного чтения (т.к. при выполнении запроса мы пытаемся сперва наложить S блокировку на все считываемые записи);
2. Неповторяемого чтения (другие транзакции не смогут изменить строки, которые нам вернул запрос, т.к. на них установлена S блокировка до конца транзакции).
Разумеется, возможны фантомы.
Судя по всему, это проявление механизмов оптимизации MS SQL Server. Запрос достаточно простой и не сложно догадаться, какие записи имеет смысл блокировать до конца транзакции, а какие — нет.
В реальной практике, я бы не стал закладываться на эту особенность и можно для упрощения считать, что S блокировка будет накладываться на все считываемые записи и держаться до конца транзакции.
Вопрос по разделению итогов
в курсе говорится, что нет смысла использовать разделение, если требуется контроль остатка
но если ситуация такая: регистр по учету остатков товаров, при оприходовании контроль остатков не нужен, он нужен только при списании
По-моему в этом случае тоже следует включить разделение итогов, чтобы хотя бы поступления можно было вводить параллельно?
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, добрый день!
когда мы устанавливаем явную управляемую блокировку на регистр сведений и не указываем никаких фильтров мы блокируем всю таблицу и параллельную запись\чтение выполнить не можем. а как заблокировать в регистре сведений только имеющиеся записи? причем в задаче требуется дать возможность добавить новые записи параллельно.
…
(текст комментария доступен только участникам Мастер-группы)
вот простейший пример
Запрос.Текст =
«ВЫБРАТЬ
| ЧекККМ.Ссылка
|ИЗ
| Документ.ЧекККМ КАК ЧекККМ
|ГДЕ
| ЧекККМ.КассаККМ = &КассаККМ
|
|ДЛЯ ИЗМЕНЕНИЯ
| Документ.ЧекККМ»;
НачатьТранзакцию();
РезультатЗапроса = Запрос.Выполнить();
если сделать выборку, потом ставить управляемую блокировку на результат запроса и дальше работать с данными не получится такой ситуации, что два сеанса выполнят запрос параллельно, а потом будут пытаться поставить блокировку ?
…
(текст комментария доступен только участникам Мастер-группы)
1. я пытаюсь перейти с автоматического на управляемый.
2. я переживаю вот из-за чего: при переходе с автоматического на управляемый режим запрос выполнится, блокировка S снимется после выполнения и получается что нужно установить установить явную исключительная, верно? не возникнет ли каких-либо проблем, так как между блокировкой запроса S и существует время в котором данные не заблокированы вообще никак.
Запрос.Текст =
«ВЫБРАТЬ
| ЧекККМ.Ссылка
|ИЗ
| Документ.ЧекККМ КАК ЧекККМ
|ГДЕ
| ЧекККМ.КассаККМ = &КассаККМ»;
НачатьТранзакцию();
РезультатЗапроса = Запрос.Выполнить();
// время в котором данные не заблокированы
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(«Документ.ЧекККМ»);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = РезультатЗапроса.Выгрузить();
Блокировка.Заблокировать();
//работа с данными …
ЗафиксироватьТранзакцию()
…
(текст комментария доступен только участникам Мастер-группы)
мне необходимо заблокировать документы, потому что в управляемой транзакции блокировка снимется после выполнения запроса, а данные документы параллельно никто изменить не должен.
я понимаю, что если я изменю документ и запишу, то он заблокируется до конца транзакции, но между выполнением запроса и записью документов в нашем примере, в блоке «//работа с данными …», есть еще много строк кода, которые выполняется, например, секунд 5-10.
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, скажите пожалуйста, в какой момент лучше использовать метод набора записей Очистить(). В конце транзакции? При его использовании будет блокироваться регистр как в случае, если установлен признак автоматического удаления движений?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
У меня вопрос по разделению итогов.
Режим конфигурации — Авт и Упр. Если я ставлю этот разделитель в истину и просто обновляю конфигурацию, то на стороне СУБД создается колонка _Splitter, но кроме этого в таблице оборотов происходит задваивание строк, т.е. к каждой строке с сплитером =0, добавляется строка со сплитером =1 и незаполненными ресурсами, т.е. таблица оборотов раздувается вдвое(!).
Но тут есть обходной путь — раздувать не будет, если
1) перевести конфу в упр режим
2) выставить режим разделения итогов (тогда и реструктуризация должна пройти быстрее)
3) перевести обратно в автомат-управляемый
Хотелось бы понять, зачем платформа задваивает в автоматич режиме?
Про разделение пишут «…Записи будут «размножаться» только при параллельно выполняемых транзакциях. Их количество по каждой комбинации измерений будет зависеть от максимального количества одновременно выполняемых транзакций..» т.е. я правильно понимаю что раздвоение какой-то записи должно быть в случае одновременной записи по одинаковым комбинациям измерений этой записи? а не заранее?
Когда-то обсуждал тут http://www.forum.mista.ru/topic.php?id=707044
Опыт проводил на оборотном регистре, думаю также происходит и регистре остатков. Платформа (8.2.17.153).
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, добрый день!
Вопрос по 20-му заданию. Правильно я понимаю, что на 8.3 с Read Comitted Snapshot параллельная работа будет возможна в обоих случаях?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день! В видео «Кто кого заблокировал» в сводной таблице для способа узнать кто кого заблокировал для консоли кластеров стоит плюсик в колонках «на уровне СУБД», «на уровне 1С». Но в видео не показано как понять в консоли где возникла блокировка.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день, Андрей.
с блокировками RangeS всё понятно, а что такое RangeU и RangeХ — не очень. как они «работают»?
…
(текст комментария доступен только участникам Мастер-группы)
то есть когда мы записываем набор в регистр накопления (только записываем, ничего в нем перед записью не читаем) хотим мы этого или нет блокируется диапазон в регистре? не очень понятно зачем и как примерно «прикинуть» какой диапазон будет заблокирован? диапазон накладывается на основную таблицу или таблицу остатков\оборотов ?
я конечно понимаю, что мы боримся с фантомами, но как-то «туго» это впитываю :(
к примеру, у нас простая таблица из 1 числовой колонки, где имеются записи: 1, 2, 3, 20, 21, 22, 50 и 51. я хочу записать запись со значением 15. правильно ли я понял, что «по книжке» 1с заблокируется диапазон от 3 до 20, а на практик от 15 до 20?
…
(текст комментария доступен только участникам Мастер-группы)
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, но там не сказано на какие таблицы (основную или итогов\оборотов) накладывается блокировка диапазона или на все ?
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, добрый день.
Поправьте если я ошибаюсь.
В конфигурации стоит режим управления блокировок данных «Управляемый»
Все документы и регистры используют режим «Автоматический»
Посмотрел по коду конфигурации и не обнаружил использование явных управляемых блокировок по регистрам остатков.
Правильно я понимаю, что конфигурация работает в управляемом режиме не смотря на автоматический режим блокирования регистров и документов? И есть вероятность что в базе могут быть из-за этого отрицательные остатки?
Спасибо.
…
(текст комментария доступен только участникам Мастер-группы)
Насколько мне было известно, Для Изменения в запросе отрабатывает только для автоматического режима блокировок. При управляемых блокировках эта команда игнорируется.
Или «Для изменения» актуальна и в управляемых блокировках?
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, подскажите, а в задании 20 может быть более одного ответа? Другими словами, можно узнать, имеет ли мой ответ право на существование?
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте! Хотел уточнить правильно ли я понял: если запрос выполняется не в транзакции, то все равно будет наложена s-блокировка на уровне СУБД на период выполнения запроса, и если запрос неоптимальный, то все то время, пока он выполняется, другие пользователи не смогут работать с заблокированными записями.
Если все правильно, то будет ли чем-то отличаться от этой схемы выполнение запроса в транзакции?
Или указанная схема работает только при чтении в транзакции, а при чтении вне транзакции вообще не устанавливается никаких блокировок — ни на уровне 1С, ни на уровне СУБД?
…
(текст комментария доступен только участникам Мастер-группы)
…
(текст комментария доступен только участникам Мастер-группы)
А в 8.3 при чтении в транзакции блокировка не будет наложена, так как читается версия объекта к моменту начала транзакции?
…
(текст комментария доступен только участникам Мастер-группы)
Помогите, пожалуйста, разобраться: в книге «Настольная книга эксперта» на странице 50 написано: «… следует иметь в виду, что управляемые блокировки платформа ставит еще и сама: разделяемые — на время выполнения чтения, когда оно выполняется в объектной технике, исключительные — до конца транзакции». Насколько я понимаю эту фразу, то на время чтения объектов разделяемая блокировка на уровне 1С накладывается. А в уроках вы говорили обратное.
…
(текст комментария доступен только участникам Мастер-группы)
Понятно, спасибо)
Комментарий к Уроку: 83,84,85 «Свойство БлокироватьДляИзменения». Уроки тяжелые для понимания, и если бы не ваш урок про неявные управляемые блокировки в упр режиме блокировок конфигурации, то были бы не подъемные.
Долго медитировал над этим уроком, мне кажется вы тут вводите немного в заблуждение слушателей, рассказывая, про то как данное свойство не удаляет колонку «splitter «из СУБД. Т.е. мысли все равно начинают крутиться вокруг этой колонки и СУБД.
Установка данного свойства для набора при записи, не влияет на блокировку на уровне СУБД, хотя Deadlock возникает на стороне СУБД, это явно видно из сообщения об ошибке (а при уровне изоляции Read Committed SnapShot Deadlock по всей видимости не должен возникнуть, т.к. чтение не блокирующее).
Из синтаксис помощника: «будет установлена управляемая блокировка для всех комбинаций измерений в соответствии с записями набора записей», а при попытке использования в автоматическом режиме блокировки вызывает исключительную ситуацию.
Получается данным свойством мы говорим менеджеру управляемых блокировок: «Не учитывай поле Splitter», естественно никаких полей из СУБД менеджер блокировок не имеет полномочий удалять.
Поправьте, если я не прав.
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте!
Еще вопрос.
При тестировании различных вариантов блокировок столкнулся с такой ситуацией.
Конфигурация на управляемых блокировках, в обработке проведения документа вызываю метод набора записей Движения.Тест.Записать() и ставлю после него точку останова.
Во втором окне пытаюсь в транзакции выполнить запрос к остаткам регистра по тем же измерениям.
При проведении документа из состояния «Не проведен» запрос во втором окне ожидает на блокировке. А при перепроведении документа без изменений, т.е. при проведении уже проведенного документа, ожидания на блокировках не возникает. Свойство документа РежимЗаписиДвиженийПриПроведении («Записывать выбранные», «Записывать модифицированные») не ситуацию не влияет. Получается, что даже при явной записи методом Записать() фактической записи в регистр не происходит, если данные не менялись?
И по этой же ситуации, если в проведенном документе что-то изменить и перепровести, то заблокируются и «старые» данные (до изменения), т.к. по ним тоже надо пересчитать итоги, и новые?
…
(текст комментария доступен только участникам Мастер-группы)
Андрей здравствуйте.
На многих проектах вижу как программисты строят системы учета без регистров (сведений или накопления), данные получают из документов и их табличных частей.
1С методически говорит, что данный подход не верен.
Для себя не могу четко ответить на данный вопрос. Почему ?
Логика следующая :
При записи документов (наложении Х блокировки), табличные части блокируются полностью, или все таки есть какая то гранулярность ?
Следовательно, при чтении данных табличных частей в транзакции, другие документы просто не могут наложить Х блокировку.
В итоге избыточные блокировки.
В случае же с регистрами, есть хорошая гранулярность при записи данных, следовательно производительность увеличивается.
Скажите, верно мыслю ? Или все таки у подхода «без регистров» есть какие то другие «грабли» в плане производительности ?
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте!
Возник такой вопрос по заданию 20: При установке Range-блокировки блокируется диапазон + граничные значения (ну, или только верхняя граница). Пользователь Б накладывает блокировку по товару “Телевизор”, а пользователь А – по товару, скажем, “Кресло”. Как узнать, попадает ли “Кресло” в эту самую границу диапазона или нет. В уроках приводился диапазон по числовому полю, а по справочнику происходит сортировка и выделение диапазона в рамках основного представления? Или же используется Ссылка?
…
(текст комментария доступен только участникам Мастер-группы)
Я это имел в виду когда писал вопрос.
У нас измерения регистра ссылочного типа.
При записи набора данных регистра накопления в автоматическом режиме по измерениям будет наложена Range-блокировка? Если да, то вопрос о границах диапазона остается в силе.
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте!
В задании 30 в конце написано, что нужно прислать ответ в письменном виде, хотя он выложен тут же в решениях. Насколько я понимаю, вариант решения присылать все же не нужно?
Добрый день!
Задание № 30 является необязательным. Отчет по нему отправлять не нужно.
Вопрос по решению 20-го задания. Правильно ли утверждение, что результат наложения условия на «Резервный склад»:
1. будет отличаться от того результата, что приведен в решении, если используется автоматический режим проведения и «версионные» СУБД (из-за гранулярности блокировки)
2. в некоторых случаях может отличаться для автоматического режима и «блокировочной» СУБД (из-за диапазона, на который накладывается блокировка )
?
…
(текст комментария доступен только участникам Мастер-группы)