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

Здравствуйте.
Столкнулся проблемой обращение к реквизиту ссылки (ссылка.код) выполняется в неявной транзакции.
Платформа 8.2.19.130 (пробовал и на 8.3.6.2152, результат аналогичный), сервер х64, конфигурация с нуля, управляемый режим, обычное приложение, совместимостей нет.
Создал два справочника (Справочник1, Справочник 2).
Справочник1 оставил по умолчанию без реквизитов.
В справочник2 добавил ТЧ с двумя примитивными реквизитами (число, строка).
Для каждого справочника создал по одному элементу.
Создал обработку с двумя реквизитами ссылающиеся каждый на свой справочник.
Эксперимент 1. Выбрал спрвочник1 в элемент формы, вызвал строку кода «сообщить(Реквизит1.Код);». В профайлере все в не транзакции и все запросы с предикатом WITH(NOLOCK).
Эксперимент 2. Выбрал спрвочник1 в элемент формы, вызвал строку кода «сообщить(Справочники.Спрвочник1.НайтиПоКоду(“000000001”).Код);». В профайлере все в не транзакции и все запросы с предикатом WITH(NOLOCK).
Эксперимент 3!! Выбрал спрвочник2 в элемент формы, открытие формы списка справочника2 штатно (без транзакции). Вызвал строку кода «сообщить(Реквизит2.Код);».
Получил:
BEGIN TRANSACTION
go
exec sp_executesql N’SELECT
T1._IDRRef,
T1._Version,
T1._Marked,
T1._IsMetadata,
T1._Code,
T1._Description,
0 AS SDBL_IDENTITY
FROM _Reference8 T1
WHERE T1._IDRRef = @P1′,N’@P1 varbinary(16)’,0x8C61005056B326FD11E56BB06BC86ED0
go
exec sp_executesql N’SELECT
T2._LineNo10,
T2._Fld11,
T2._Fld12,
0 AS SDBL_IDENTITY
FROM _Reference8_VT9 T2
INNER JOIN _Reference8 T3
ON T3._IDRRef = T2._Reference8_IDRRef
WHERE T3._IDRRef = @P1
ORDER BY 4 ASC, T2._LineNo10′,N’@P1 varbinary(16)’,0x8C61005056B326FD11E56BB06BC86ED0
go
exec sp_executesql N’SELECT
T4._Version
FROM _Reference8 T4
WHERE T4._IDRRef = @P1′,N’@P1 varbinary(16)’,0x8C61005056B326FD11E56BB06BC86ED0
go
COMMIT TRANSACTION
go
Эксперимент 4. Выбрал спрвочник2 в элемент формы, вызвал строку кода «сообщить(Справочники.Спрвочник2.НайтиПоКоду(“000000001”).Код);». В профайлере все аналогично эксперименту 2.
Почему в эксперимент 3 появилась не явная транзакция?
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, а как же эксперимент1?
Пробовал и так «Сообщить(Реквизит1.Код);», и так «Сообщить(Реквизит1.ПолучитьОбъект().Код);».
Результат один, транзакция не открывается.
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, так стандартный реквизит «Код» у справочника же есть.
Провел дополнительный эксперимент добавил в справочник1 реквизит1(Тип Строка).
Заполнил этот реквизит у элемента справочника.
И выполнил код: Сообщить(Реквизит1.Реквизит1); //те аналогично коду Сообщить(Справочники.Справочник1.НайтиПоКоду(..).Реквизит1);
Результат:
exec sp_executesql N’SELECT
T1._IDRRef,
T1._Version,
T1._Marked,
T1._PredefinedID,
T1._Code,
T1._Description,
T1._Fld24
FROM dbo._Reference7 T1
WHERE T1._IDRRef = @P1′,N’@P1 varbinary(16)’,0x8C61005056B326FD11E56BB060D43ADA
Транзакция не открылась.
Получается что транзакция открывается если идет обращение к реквизиту ссылки в объектной технике у которой(ссылки) есть хотя бы одна табличная часть..
http://downloads.v8.1c.ru/content//Platform/8_3_7_1633/1cv8upd.htm#4e71dd3a-dc62-11e4-a3f7-0050569f678a
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, не хочется вступать в полемику, но согласно ссылки и проведенных опытов, неявная транзакция открывается только в том случаи если у ссылки есть табличная часть. Это относится к платформам 8.2 и 8.3 до версии 8.3.7.1633
Получить открытие неявной транзакции при обращении к реквизиту ссылки у которой нет табличной части — мне не удалось опытным путем.
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, поясните пожалуйста еще раз — почему код Сообщить(Реквизит1.Реквизит1) не вызвал блокировку? Разве Реквизит1.Реквизит1 это не обращение к реквизиту объекта?
…
(текст комментария доступен только участникам Мастер-группы)
Разумеется внимательно, и пытаюсь его осмыслить и перепроверить.
Ввело в заблуждение «ИЛИ» (Неявная транзакция открывается в том случае, если вы обращаетесь к реквизиту объекта или получаете сам объект у которого есть табличная часть.)
Я понял ваш ответ как либо обращение к реквизиту либо получение объекта.
PS Разбирая практическое задание 39 и отвечая на вопрос (Что изменится, если выполнять данный код вне транзакции?) тоже важно понимать если у справочника товаров ТЧ :-)
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте! Есть дефицит понимания о том как работает RCSi для необъектных сущностей.
С объектами вроде бы все очевидно, есть реквизит «версия объекта». А как происходит версионирование необъектных сущностей. Каким то образом транзакция №2 знает что на данные некоторого пространства уже наложена блокировка и что из себя представляет версия в этом случае. Я так предполагаю что в tempdb в таблице блокировок добавляется запись с заблокированными данными и полем типа «Момент времени», и вторая транзакция строит свой запрос до «момента времени». Извиняюсь на некоторую сумбурность, но верно ли я рассуждаю?
…
(текст комментария доступен только участникам Мастер-группы)
Еще вопрос, по уроку 83 «БлокироватьДляИзменения».
Суть проблемы и ее решение в среде 1С 8.2 понятна.
1. А воспроизводится ли взаимоблокировка в среде 1С 8.3? После записи 2мя транзакциями параллельно в таблицу итогов в режиме разделения итогов они, эти транзакции, обе могут считать остатки, так как S-блокировка не требуется. Получается, что взаимоблокировки не будет?
2. Тогда возникает проблема грязного чтения, так как изменения в регистре не зафиксированы транзакциями, и чтение остатков после записи (до окончания транзакции) для контроля даст некорректный результат, так как не будут учтены новые записи. Правильно? Какой тогда может быть контроль остатков?
3. Как совмещается «новая методика контроля остатков» с «1С 8.3 + упр режим блокировок»? То есть сначала записываем движения, потом читаем актуальные остатки на предмет наличия отриц остатков. Но изменения в регистре не зафиксированы транзакцией, по сути это «грязные» данные, и при чтении остатков регистра мы должны получить остатки на момент до Х-блокировки, то есть до записи.
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте.
У меня небольшое непонимание различий между упр режимом 1С 8.2 и упр. режимом 1С 8.3
Правильно ли утверждать, что:
1. в случае упр режима 8.2 в транзакции:
— чтение данных запросом не приводит к установке неявной упр блокировки, но приводит к установке S-блокировки СУБД на период чтения (т.к уровень изоляции для 8.2 упр режима — READ COMMITTED)
— чтение объектных данных объектной моделью — аналогично пункту выше
— чтение необъектных данных объектной моделью приводит к установке неявной упр блокировки до конца транзакции и установке блокировки СУБД
2. в случае упр режима 8.3 в транзакции:
— любое чтение данных НЕ приводит к установке неявной блокировки на уровне СУБД, так как используется уровень изоляции READ COMMITTED SNAPSHOT, то есть работает версионирование.
— неявная упр. блокировка устанавливается только при чтении необъектных данных объектной моделью (по аналогии с 8.2)
Почему я все это пишу. Во всех слайдах указывается, что используется уровень изоляции READ COMMITTED в упр. режиме, хотя в 8.3 используется READ COMMITTED SNAPSHOT со своими небольшими особенностями.
…
(текст комментария доступен только участникам Мастер-группы)
Как узнать какая схема контроля остатков используется в типовом решении? В частности в КА1.1.61.1
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте. В автоматическом режиме при записи не объектных сущностей открывается X блокировка, c типом изоляции Searizable (Range-x) на диапазон. В управляемом режиме используется изоляция Read Commited, не совсем понятно как отрабатывает данная изоляция с необъектными сущностями с блокировкой диапазона? Интересует только блокировка на стороне СУБД.
…
(текст комментария доступен только участникам Мастер-группы)
Вопрос по слайду «Реализация блокировок в СУБД» (стр.177):
Правильно понимаю, что если достаточно много пользователей и достаточно часто будут накладывать S блокировку на ресурс то пользователь, желающий наложить X блокировку просто не дождется?
…
(текст комментария доступен только участникам Мастер-группы)
Какие блокировки накладывает (если вообще накладывает) запрос вызываемый из формы списка (документов или справочников)? Например если он вызывается в обработчике «ПриПолученииДанных» для вывода информации в дополнительные колонки списка.
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте. Заметил противоречие в двух слайдах.
Урок 68 — Сводная таблица режимов. Автоматическая транзакция принимает уровни изоляции только Repeatable Read и Serializable.
Урок 63 — Режимы блокировок СУБД. Автоматическая транзакция версионника принимает уровень изоляции Read Committed.
Где же всё-таки верная информация.
…
(текст комментария доступен только участникам Мастер-группы)
Выложите исправленный вариант?
…
(текст комментария доступен только участникам Мастер-группы)
платформа v8.3, режим READ COMMITED SNAPSHOT (СУБД работает как версионник)
записываем набор данных и читаем одни и те-же данные
1. При записи набора данные возникнет управляемая блокировка исключительная
2. При чтении управляемой блокировки не будет
какие блокировки СУБД возникают при чтении и записи?
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте.
Непонятны некоторые моменты уровня изоляции READ COMMITTED SNAPSHOT.
Насколько я знаю есть блокировки СУБД (S U X и прочие), которые ставит СУБД, а так же есть блокировки, которые ставит сама платформа (только S X). Правильно ли я понимаю: так как используется версионирование, то блокировки СУБД не используются, но чтобы не возникало конфликтов на запись + запись платформой будут установлены X и X блокировки, и т.к. они не совместимы, то первая транзакция будет изменять данные, а вторая ждать.
…
(текст комментария доступен только участникам Мастер-группы)
Вот как бы очень интересно соответствия блокировок СУБД и блокировок 1С (управляемый режим)
платформа 8.3, режим READ COMMITED SNAPSHOT
исключительная соответствует X блокировке на СУБД
разделяемая соответствует S блокировке на СУБД
Правильно или есть нюансы?
…
(текст комментария доступен только участникам Мастер-группы)
Но ведь разделяемая управляемая блокировка снимается после чтения запроса, т.е. не до конца транзакции. Уровень изоляции read committed.
…
(текст комментария доступен только участникам Мастер-группы)
В книге Настольная книга 1С:Эксперта по тех. вопросам (стр. 50) написано:
При этом следует иметь в виду, что управляемые блокировки платформа ставит ещё и сама: разделяемые — на время выполнения чтения, когда оно выполняется в объектной технике, исключительные до конца транзакции.
Решил проверить сам, провёл кучу экспериментов. В итоге оказывается что в официальной книге такая грубая ошибка.
Для себя составил таблицу зависимости. Посмотрите, пожалуйста, её во вложении — правильно ли я теперь понимаю когда и как ставятся блокировки.
Так же попутно появился большой вопрос, он так же во вложении.
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте,
У меня вопрос про уровень изоляции READ COMMITTED SNAPSHOT.
На складе есть одно количество определенного товара.
1-ая Транзакция читает остаток на складе и устанавливает Х-блокировку на изменение данных
Затам 2-ая блокировка тоже читает остаток на складе и из-за версионности видит одно количество товара (1-ая транзакция еще не завершилась)
После 1-ая транзакция завершилась, списав товар со склада, сняв Х-блокировку.
Что будет со 2-ой транзакцией? отказ транзакции или списание товара в минус?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день.
Андрей, есть ли у Вас информация (или мнение) насчет: почему в 1С не поддерживается уровень изоляции SNAPSHOT? Кажется, он выгодно отличается от READ COMMITTED SNAPSHOT тем, что решает проблему неповторяющегося чтения?
…
(текст комментария доступен только участникам Мастер-группы)
При разработке механизма многопоточной работы с регистром бухгалтерии наткнулись на следующую проблему:
Очистка движений регистра бухгалтерии за определенный период происходит в несколько потоков. Документы-регистраторы произвольно делятся на группы, после чего запускается несколько фоновых заданий. Каждое фоновое задание последовательно обрабатывает свой кусок данных — создает и без чтения записывает набор записей по регистратору. При этом возникает взаимоблокировка с последующим таймаутом ожидания блокировки. Разделение итогов на регистре включено.
Сервис deadlock показал блокировки в таблицах «ИтогиПоСчетамССубконто1» и «ИтогиПоСчетамССубконто3».
Ситуацию удалось воспроизвести на каркасной конфигурации, установив время ожидания блокировок 2 с.
Просьба пояснить, почему при включенном разделителе итогов при параллельной обработке движений возникают взаимоблокировки?
…
(текст комментария доступен только участникам Мастер-группы)
Вопрос по отличию версионных СУБД от блокировочников.
Насколько я понял, ключевое отличие состоит в том, что в версионных СУБД нет ожиданий на блокировках при чтении, т.к. конкурирующие транзакции не ждут, пока завершится транзакция, захватившая ресурс на изменение, а читают версию данных, которая имеется на момент начала этой транзакции, верно?
Есть ли ещё какие-то принципиальные различия?
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, тогда вопрос в следующем.
В курсе говорится, что при автоматическом режиме управления блокировкой при использовании версионника, например, если мы читаем или пишем одну строку, происходит блокировка сразу всей таблицы (S или X типа соответственно).
Я правильно понимаю, что главная проблема в том, что конкурирующие транзакции не смогут параллельно писать в эту же таблицу, пока не завершится первая транзакция, заблокировавшая всю таблицу целиком ради одной записи? При этом чтение в параллельных транзакциях будет проходить без ожиданий.
И не совсем понятно, а почему в автоматическом режиме версионники блокируют всю таблицу целиком? Есть какая-то особая причина?
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, тогда не понятен следующий момент:
В автоматическом режиме в версионниках:
1. При чтении данных — не блокируется ничего, т.е. теоретически возможно ситуация, что мы прочитали в транзакции остатки, ничего при этом не заблокировав, а в этот момент другая транзакция быстренько заблокировала всю таблицу и списала остатки. Соответственно, наша транзакция уже будет списывать с регистра то, чего там нет.
Как тут решена проблема отрицательных остатков?
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, тогда не понятен следующий момент: В автоматическом режиме в версионниках: 1. При чтении данных — не блокируется ничего, т.е. теоретически возможно ситуация, что мы прочитали в транзакции остатки, ничего при этом не заблокировав, а в этот момент другая транзакция быстренько заблокировала всю таблицу и списала остатки. Соответственно, наша транзакция уже будет списывать с регистра то, чего там нет. Как тут решена проблема отрицательных остатков? Источник: ©Курсы-по-1С.рф
…
(текст комментария доступен только участникам Мастер-группы)
Андрей, немного запутался…
Как сопоставить вот эти две фразы:
1. Версионники не блокируют данные при чтении вообще, блокируют только при записи.
2. Если же используется автоматический режим блокировок, тогда в версионниках включается уровень Serializable и он у версионников реализован так, что даже параллельное чтение будет не возможно.
Почему невозможно параллельное чтение, раз чтение вообще не блокирует записи?
Андрей, как знал, сегодня был в билете вопрос как раз про возможность параллельной работы в версионнике в автоматическом режиме.
Воспользовался вашим ответом «Если же используется автоматический режим блокировок, тогда в версионниках включается уровень Serializable и он у версионников реализован так, что даже параллельное чтение будет не возможно.»
Как только я сказал, что в версионнике даже читать параллельно нельзя одну таблицу, то мне сразу поставили минус за этот вопрос, т.к. якобы чтение и чтение всегда совместимы. (Препод вроде был Морозов Павел)
Действительно ли нельзя читать одну таблицу в двух параллельных транзакциях?
Сейчас пойду разворачивать Postgre и экспериментировать.
Да, и там было два запроса к одной таблице, одна причем с опцией для изменения.
Завтра пойду ему доказывать если что, что я был всё-таки прав, а то из-за этого не смог третий плюс получить.
…
(текст комментария доступен только участникам Мастер-группы)
…
(текст комментария доступен только участникам Мастер-группы)
То есть даже если мы читаем параллельно две совершенно разные записи, в автоматическом режиме в Postgree мы не сможем этого сделать?
Никак не могу поставить Postgree, постоянно какие-то ошибки вылетают.
…
(текст комментария доступен только участникам Мастер-группы)
Сделал в Postgree следующий пример:
НачатьТранзакцию();
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| РегистрСведений1.Измерение1,
| РегистрСведений1.Измерение2
|ИЗ
| РегистрСведений.РегистрСведений1 КАК РегистрСведений1»;
РезультатЗапроса = Запрос.Выполнить();
ЗафиксироватьТранзакцию();
Режим управления блокировками — автоматический, Postgree 9.4.2, платформа 8.3.5.
В одной сессии — поставил точку останова перед фиксацией транзакции, в другой — выполнил тот же код.
Вторая сессия без проблем выполнила данный код, несмотря на блокировки первой транзакции..
Андрей, проверьте, пожалуйста. Может быть мне попробовать использовать другие версии, чтобы воспроизвести ожидание при чтении одной записи?
…
(текст комментария доступен только участникам Мастер-группы)
Потом напишите, пожалуйста, ваши результаты
…
(текст комментария доступен только участникам Мастер-группы)
…
(текст комментария доступен только участникам Мастер-группы)
Задание 17
«Что изменится если поставить документу режим управляемый?
Блокировка также будет снята только после выполнения транзакции, только теперь это будет
управляемая блокировка платформы».
Я так понимаю, в управляемом режиме в данной ситуации при записи данных в регистр будет наложена как управляемая исключительная блокировка, так и блокировка X-типа на уровне СУБД?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
Если в транзакции очистить набор записей, содержащий 20000 записей, а затем добавлять в этот набор новые записи, возникнет ли эскалация (для 8.2)?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
В консоли сервера 1С у каждой базы есть раздел Блокировки. Бывают ситуации когда активных сеансов в базе нет, но в разделе Блокировки есть «зависшие» соединения, которые не позволяют обновить базу данных. Как их можно сбросить? Кроме перезапуска агента сервера 1С, другого решения не нашел.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день.
Андрей, подскажите пожалуйста — столкнулся с задачей перевести конфигурацию на управлюмые блокировки.
Конфигурация какая то старая версия УПП для Казахстана, мб она сделана еще до того как в платформе временные таблицы, вероятно по этой причине
довольно много вложенных запросов.
Контроль остатков осуществляется процедурами КонтрольОстатков(…) в модулях наборов записей регистров накопления.
Довольно много(почти все) таких процедур, где вложенный запрос соединеняется с виртуальной таблицей остатков регистра накопления по которому производится контроль
остатков, а также с другими виртуальными таблицами остатков регистров накопления. При в этом конструкции языка запросов «Для Изменения» указывается только одна
таблица — регистр накопления по которому производится контроль остатков.
Раньше(до прохождения вашего курса) я думал, что нужно наложить управляемую блокировку на ту таблицу которая указана конструкции языка запросов «Для Изменения» и
блокировать только те данные — которые указаны в параметрах виртуальной таблицы.
Если я правильно понял видео курса то в этом случае нужно наложить управляемые блокировки и на другие виртуальные таблицы остатков, это так?
Прикрепил два текстовых файла — Запрос_Отдельно_.txt, и второй Запрос_В_Контексте_Процедуры_.txt, для того чтобы было наглядно видно то о чем я написал выше.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день.
1. Можно ли сказать, что с версионными СУБД 1с работает так же как в MS SQL с уровнем изоляции read commited snapshot ?
2. Можете уточнить в какой момент делается снимок данных при использовании read commited snapshot, перед установкой блокировки или перед началом транзакции?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день.
Вопрос по видео №59 «Внутреннее устройство управляемых блокировок».
Почему блокировка №4 будет поглощена блокировкой №3, а блокировка №7 будет поставлена в очередь, хотя она также полностью совпадает с блокировкой №3?
…
(текст комментария доступен только участникам Мастер-группы)
В ходе экспериментов обнаружил непонятное для себя поведение платформы. Помогите разобраться.
Автоматический режим. Во время проведения одного документа продажи (с точкой останова после записи движений) не получается открыть соседний непроведенный документ продажи. Причем какой-то получается, а какой-то нет. Наверное это связано с тем, что во время открытия формы документа идет считывание наборов записей, но на некоторые лишние строки установлена X блокировка проводимым документом, верно?
И вторая ситуация: документ не проводим, а перепроводим, не изменяя. Соседние документы уже открываются, но некоторые не записываются, т.е. непровденный документ не можем просто записать. Тут мне совсем не понятно, почему происходит ожидание на блокировках?
Можете прокомментировать, какие блокировки приводят к ожиданию в том и в другом случае? В управляемом режиме такого не наблюдается.
…
(текст комментария доступен только участникам Мастер-группы)
Посмотрел в профайлере, какой запрос блокируется при записи непроведенного документа. Оказался такой запрос:
exec sp_executesql N’SELECT
CAST(COUNT(T1._RecorderTRef) AS NUMERIC(10))
FROM dbo._AccumRg18 T1 WITH(SERIALIZABLE, UPDLOCK)
WHERE T1._RecorderTRef = 0x0000000C AND T1._RecorderRRef = @P1′,N’@P1 varbinary(16)’,0x9228001E6711E5F811E5221F023CD1C5
Этот запрос считает количество записей в регистре остатков. И соответственно ждет, т.к. соседний документ захватил лишние записи. Тогда возникают два вопроса:
1. Зачем платформа генерирует такой запрос просто при записи документа?
2. Что означает указание UPDLOCK?
В случае ожидания при открытии формы, ожидание происходит на запросе
exec sp_executesql N’SELECT
T1._Period,
T1._RecorderTRef,
T1._RecorderRRef,
T1._LineNo,
T1._Active,
T1._RecordKind,
T1._Fld19RRef,
T1._Fld404RRef,
T1._Fld20RRef,
T1._Fld21
FROM dbo._AccumRg18 T1 WITH(SERIALIZABLE)
WHERE T1._RecorderTRef = 0x0000000C AND T1._RecorderRRef = @P1
ORDER BY T1._LineNo’,N’@P1 varbinary(16)’,0x9228001E6711E5F811E5221F023CD1C5
Здесь вроде все понятно — форма считывает движения по регистру остатков.
На всякий случай, выгрузка базы: https://yadi.sk/d/6fZ1fKxnhiEHm
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо. Но осталось непонятным, зачем платформа при записи непроведенного документа делает запрос к регистрам и накладывает U-блокировку? Опытным путем выяснил, что это делает форма документа, т.к. при программной записи документа такого запроса нет. Но остается вопрос, зачем это делает форма?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
Видео 56. На мой взгляд в нем ошибка: Вы говорите, что если в наборе записей измерение не заполнено, то блокировка установится на все значения этого измерения. Провел эксперимент на учебной конфигурации курса. Провожу док. Поступление с пустым складом и номенклатурой Стул — с точкой останова в конце обработки проведения. В другой сессии провожу реализации стула. Если склад заполнен, то блокировки не возникает, если реализация с пустого склада, то возникает блокировка. Таким образом при пустом измерении блокируется именно пустое значение этого измерения, а не все возможные значения. Версия платформы 8.3.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
Вопрос по уроку 57 установка неявных упр. блокировок.
Пример когда проводится документ по регистру накопления.
Блокировка устанавливается по контрагенту, хочется понять почему «Период» не влияет на блокировку, ведь документы проводятся разной датой.
Значения «Периода» в регистре будет различным. почему в блокировке не участвует значение «Периода», хотя перед этим было показано, что значение «Периода» входят в состав кластерного индекса «Таблицы итогов».
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
Добрый день!
Подскажите, пожалуйста, колонка Rows в плане запроса — это количество строк, обработанных сервером БД или это число строк подходящих под условие поиска?
…
(текст комментария доступен только участникам Мастер-группы)
Если будет Table Scan, в результате которого под условие попадет только 10 строк, то в колонке rows будет отображено 10 или столько, сколько строк просканировал сервер для нахождения этих 10?
…
(текст комментария доступен только участникам Мастер-группы)
Ясно, спасибо!
Добрый день. Очередная порция вопросов. Тут вопросы из разных занятий, но очень неудобно будет, если я их буду отдельно писать, поэтому пишу в одном месте:
1. Как запустить счетчики производительности при старте системы?
2. Если мы используем 8.3 и у нас есть несколько центральных кластеров, что указывать в «кластер серверов» при подключении информационной базы? Я, вероятно, этот момент упустил.
3. Проясните, пожалуйста, кое какие моменты по использованию итогов в регистрах. В управлении итогами есть кнопка «Установить период итогов…» и соответствующая колонка «Период итогов». В этой колонке какое-то значение появляется по нажатию указанной кнопки. Так вот, на что влияет этот «Период итогов»? Я думал, что она показывает период, на который итоги находятся в «хорошем» состоянии. Но после того, как жму «пересчитать итоги» в этой колонке ничего не появляется, хотя я предполагал, что там при этом должна установиться актуальная дата (конец текущего или предыдущего месяца)
4. Выполняется запрос в сеансе1 со сканированием таблицы. В этот момент сеанс2 хочет выполнить тот же запрос. Сеансу2 придется подождать, пока запрос из 1-го сеанса закончит операцию сканирования над таблицей? Это поведение зависит от того выполняется запрос в транзакции или вне транзакции?
5. Выполняется запрос в сеансе1 с поиском по индексу по условию Товар = Стол. Если в этот момент сеанс 2 будет выполнять тот же запрос, но с условием Товар = Стул, то они смогут делать это параллельно?
…
(текст комментария доступен только участникам Мастер-группы)
1, 2, 3 — ясно, спасибо!
4, 5 — а если 1 запрос со сканирование таблицы на выборку, а 2 запрос хочет в эту таблицу вставить какие-то записи, то пока 1 полностью не закончит свое выполнение, 2 будет ждать?
…
(текст комментария доступен только участникам Мастер-группы)
Просто в нескольких видео вы делаете акцент на том, что во время выполнения запроса (а в курсе рассматриваются запросы на выборку) блокируются все строки, которые обрабатываются запросом (а не строки, которые попадают в результат выполнения запроса) на время выполнения запроса.
Исходя из того, что вы выше ответили, я ещё более запутался, поэтому разделю вопрос на подвопросы. Будем считать, что у нас есть запрос на выборку и он выполняется со сканированием таблицы. Под блокировкой мы понимаем, что накладывается S блокировка.
а) Если режим изоляции Serialazible, то в результате выполнения запроса будет заблокирована вся таблица до конца транзакции?
б) Если режим изоляции Repeatable read, то в результате выполнения запроса будет заблокирована вся таблица до конца транзакции, но с возможностью вставки в неё новых строк?
в) Режим изоляции Read committed. Если происходит сканирование таблицы (как в данном случае), то разве возможна ситуация, что пока сканирование, условно говоря, дойдет до 100’000-й строки, то она уже может иметь другое значение (измениться другой транзакцией)? А если не блокировать всю таблицу на время выполнения запроса, то такие ситуации могут быть повсеместно.
…
(текст комментария доступен только участникам Мастер-группы)
> В общем-то все выше описанное только усложняет восприятие и как правило не играет большой роли при решении проблем блокировок и дедлоков
Мне, например, было очень интересно это выяснить. Если бы не выяснил, то у меня осталось бы ложное суждение о том, что строки блокируются всегда, независимо от режима изоляции. Но теперь у меня этот вопрос определенно прояснился.
Очередное спасибо за ответы!
…
(текст комментария доступен только участникам Мастер-группы)
Вы пишете: «В read committed (упр. режим) если строка попадает в выборку она блокируется до конца запроса, если не попадает, то отпускается сразу после чтения, не дожидаясь окончания запроса.»
Тогда становится непонятным пример из видео 71: Там у нас управляемый режим и неоптимальный запрос со сканированием всей таблицы. Тогда при его выполнении в read committed не будут заблокированы все записи таблицы на время выполнения запроса, а будут заблокированы только на незначительное время чтения данных из таблицы. Я верно это понимаю? И тогда пример из видео 71 становится неудачным?
…
(текст комментария доступен только участникам Мастер-группы)
Перекрывает ли действие глобальных флагов трассировки действия локальных команд на уровне конкретных таблиц или действует только по умолчанию, если не указано иное, например будет ли включена возможность эскалации для таблицы TableName командой ALTER TABLE TableName SET (LOCK_ESCALATION=TABLE), если для сервера в целом эскалацию отключили соответствующим флагом трассировки?
Кстати какой параметр необходим для включения возможности эскалации для таблицы, LOCK_ESCALATION=TABLE или LOCK_ESCALATION=AUTO ? В чем разница?
…
(текст комментария доступен только участникам Мастер-группы)
А еще раз хотелось бы уточнить по Автоматическому режиму, Serializable и Range-блокировке. Фактически используются те же типы блокировок S,U,X, отличие только в количестве блокируемых строк. т.е. если у нас автоматический режим (с чем я имею дело на рабочем месте) и два документа будут проводится одновременно по регистру с одинаковыми данными, то в случае чтения в транзакции данных регистра, до конца транзакции будет наложена блокировка Range-S, такую же блокировку установит и второй документ, т.к. S-блокировки разделяемые, и вот если далее и тому и тому документу нужно будет изменить данные в регистре, то ни одна из двух транзакций не сможет установить Range-x и мы получим deadlock, так?
И даже если в одной из транзакций в запросе мы укажем «ДЛЯ ИЗМЕНЕНИЯ», т.е. будет наложена Range-U, это ведь все равно не оградит нас от чтения второй транзакцией и в итоге все равно дедлок?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый вечер Андрей,
1)есть вопрос по видео 32-33 о Repeatable Read, там говорится, что блокировка S накладывается до конца транзакции, что в принципе понятно, но не совсем понятен пример, скажем с проведением документа, если два документа проводятся одновременно с одной и той же номенклатурой, в обработке проведения обоих читается остаток, соответственно накладывается две S-блокировки, т.к. S-блокировка совместима с другой S-блокировкой, они обе прочтут один и тот же остаток, но потом, когда будет выполнена попытка записи движений, то X-блокировку не сможет установить ни одна из транзакций и получится фактически deadlock, т.к. они обе будут ждать друг друга, правильно? т.е. проведение двух одинаковых документов в этом случае всегда взаимоблокировка?
2)у вас в одном из видеоуроков показана таблица блокировок, как она схематично выглядит, меня интересует ее работа в плане очереди, если скажем какая-то транзакция установил S-блокировку, а за ней в очередь встала Х-блокировка (она ждет), пока еще не кончилась первая S-транзакция в очередь попадает вторая S-блокировка, она может выполняться вместе с первой и начинает выполняться, первая кончается, но 2ая S-блокировка продолжается, соответсвенно X-блокировка ждет уже завершение 2ой S-блокировки и так может продолжаться бесконечно, пока не отвалится по таймауту. Я это к чему, СУБД никак не «останавливает» S-блокировки (которые пришли позже X-блокировки), если видит, что X-блокировка долго висит?
…
(текст комментария доступен только участникам Мастер-группы)
да, сейчас как раз дошел до 36 видео, где вы и указываете, что для регистров применяется другой уровень. Побежал впереди паровоза.
Кстати говоря, спасибо за рекомендацию по литературе. Начал читать SQL Server Execution Plans, хорошо организованная книга.
…
(текст комментария доступен только участникам Мастер-группы)
Проявилась интересная особенность блокировок. Точнее платформы.
Исходные данные: Конфигурация учебная (из данного курса). Тестирую в 8.3.5.1517. Режим блокировок управляемый. Разделение итогов включено (впрочем с выключенным разделением происходит тоже самое).
При проведении документа Продажа флаг БлокироватьДляИзменения = Истина.
Что происходит: Запускаю первую сессию и останавливаю проведение на последнем операторе процедуры. Во второй сессии проведение аналогичного по составу (склад и товар) к моему изумлению таймаута не вызывает и документ спокойненько проводится.
После нескольких проверок и экспериментов обнаруживаю: Таймаут для второй сессии возникает только в случае если, например, в первой сессии изменить количество в документе. То есть получается несмотря на то что движения очищаются и перезаполняются (пусть теми же данными) — при записи X блокировка на таблицу остатков в таких случаях не накладывается. Я что то неверно понял или неверно сделал? (Ведь если это так — то в таких случаях отпадает смысл анализировать остатки после записи потому что они могут измениться прямо в процессе проведения)
…
(текст комментария доступен только участникам Мастер-группы)
Но тогда можно получить все прелести от последствий «грязного» чтения. (Отрицательные остатки или, наоборот, отказ в проведении при наличии остатка). Ведь, если делается контроль остатков по новой методике, то ситуация может поменяться в момент после чтения текущих остатков и завершением проведения.
…
(текст комментария доступен только участникам Мастер-группы)
Да, если речь идет о проверке оперативных остатков — то отрицательных остатков не будет.
А вот если мы проверяем на Момент времени документа, то возникают варианты. Правда, просто блокировки тоже не спасают. Большое спасибо за разъяснение.
Еще вопрос по видео 32 — «Неповторяемое чтение.решение»
Допустим такая ситуация:
Чтобы избежать проблемы неповторяемого чтения, обе транзакции накладывают s- блокировку до конца транзакций, далее читают остатки из регистра и обе пытаются наложить х- блокировки, чтобы списать товар. Не может ли получиться такого, что s -блокировка 1 транзакции не даст установиться х- блокировке 2й транзакции, а s-блокировка 2й транзакции — не даст установиться х-блокировке 1й, т.е крест-накрест?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день! Начал изучать видеоматериалы по транзакциям и возникло несколько вопросов.
1) Не очень понял, как реализован уровень изоляции Read Comitted Snapshot.
В видеоуроке №28 приведена схема решения проблемы грязного чтения(нарисовал по памяти как вы рекомендовали):
Тр.1 Тр.2
1) Прочитать остаток(ост=1)
2) Установить х-блок
3) Списать 1шт.
4) Х блок до конца транзакции Прочитать ост. на момент до блок(ост = 1)
5) Отмена транзакции Установить х-блок
6) Списать 1шт
7) Фикс.транзакцию
У меня вопрос по строке 5. Если первая транзакция будет не отменена, а зафиксирована, то получается, что остаток, что был прочитан во 2й транзакции станет устарелым(неверным) и мы уйдем в минус. Ведь транзакция не может знать, что соседняя транзакция будет отменена. Как решается эта проблема? Не нужно ли 2 транзакции еще раз прочитать остатки после установки х-блокировки? Но тогда будет тоже самое, как и read comitted… В общем запутался…
2) Уровень Read Comitted Snapshot функционирует на основе версий. Вы сказали, что версии хранятся в таблице TempDB. Также у всех документов и справочников есть служебный реквизит «Версия данных», который меняется при изменении объекта. Есть ли корреляция между информацией в этом реквизите и информацией о версии в TempDB? И если да — зачем хранить информацию в 2-х местах?
Спасибо.
…
(текст комментария доступен только участникам Мастер-группы)
Работает ли менеджер управляемых блокировок в файловой базе? Если работает, то снимается ли S блокировка после выполнения запроса?
…
(текст комментария доступен только участникам Мастер-группы)
В видео в примере автоматических блокировок при проведении документов по разным складам и товарам и непустой таблице регистра почему второй документ не провелся? Показывался пример range блокировки, которая блокирует граничные записи. Т.е. если бы было больше складов и товаров, то документ бы провелся?
…
(текст комментария доступен только участникам Мастер-группы)
Какие блокировки накладываются при Движения.Очистить а затем Движения.Записать?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо, это понятно. А на какие записи будет наложена блокировка в том регистре, по которому мы очищаем движения?
…
(текст комментария доступен только участникам Мастер-группы)
Какой уровень изоляции транзакций будет использован при блокировке записей табличной части документа — repeatable или serializable в случае автоматического режима? Табличная часть относится к объектной сущности или к необъектной с данной точки зрения?
…
(текст комментария доступен только участникам Мастер-группы)
Блокировка.Заблокировать — надо ли в попытке?
…
(текст комментария доступен только участникам Мастер-группы)
В Автоматическом режиме блокировок, если при проведении документа посмотреть текст запроса в SQL Profiler то там видно, что рядом с таблицей пишется уровень изоляции (Repeatable read, Serializable). А вот если сделать то же самое в управляемом режиме блокировок, то там не указано никакого уровня изоляции. Хотя, казалось бы, должно быть read commited или read commited snapshot. Почему?
…
(текст комментария доступен только участникам Мастер-группы)
А что происходит в том случае когда чтение обычным запросом в 8.2 (Автоматический режим), должен быть уровень изоляции Read uncommited? Но его тоже не видно.
…
(текст комментария доступен только участникам Мастер-группы)
Вопрос по практике 20:
Почему даже если склад один в документе, то его лучше в шапку? В типовых конфах встречается по разному. Какие могут быть проблемы с складом в ТЧ?
…
(текст комментария доступен только участникам Мастер-группы)
В данном случае лишнее дублирование информации как то может повлиять на производительность? Возможны излишние блокировки или что то подобное?
…
(текст комментария доступен только участникам Мастер-группы)
Вопрос по практике 20:
Почему такая структура не будет оптимальной, если бы она была возможна?
…
(текст комментария доступен только участникам Мастер-группы)
Для ЭлементБлокировкиДанных метода УстановитьЗначение в справке есть такое примечание.
Примечание:
Следует иметь в виду, что одну и ту же запись регистра можно заблокировать дважды, первый раз блокируя саму запись, а второй раз блокируя набор, в который эта запись входит.
Можно разъяснить что к чему?? И такая возможность не противоречит самой сути блокировок??
…
(текст комментария доступен только участникам Мастер-группы)
То есть я правильно понимаю есть возможность установить блокировку на запись считать данные, быть уверенным что все эти данные не кто не поменяет, но кто то другой заблокировал набор записей, и злостно изменил их хотя блокировка на запись не снималась и в результате у меня не верные данные?? Либо возможность установить Блокировку на запись и на набор возможна только в одной транзакции??
…
(текст комментария доступен только участникам Мастер-группы)
Еще вопрос стоит ли пользоваться отложенным проведением? Есть ли это в курсах (Честно не нашел пока)? Какие подводные камни мы можем поиметь с этого?
…
(текст комментария доступен только участникам Мастер-группы)
спасибо большое за ответы
Я думаю тут сказано про блокировки одного и того же пользователя. А из курса следует, что они всегда совместимы.
Правильно ли я понимаю, что в управляемой блокировке невозможно поставить блокировку по диапазону значений (цены от 200 до 300 рублей)? И от чтения фантомов в управляемом режиме защиты нет?
…
(текст комментария доступен только участникам Мастер-группы)
Не могу понять, как работает уровень изоляции serialazible.
В уроке 8.34 выбираются все товары с ценой от 200 до 300, если по полю цена не установлен индекс, то в плане запросов будет clustered index scan, будут выбраны все записи таблицы => все записи будут заблокированы и все значения кластерного индекса. Верно ли это?
Если по полю цена установлен индекс, то будет index seek, будут заблокированы все записи в диапазоне цен от 200 до 300, а так же заблокированы значения индекса или будут заблокированы только значения индекса, а сами записи нет смысла блокировать?
Имеет ли при этом значение кластерный индекс или нет?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо! Теперь в теории стало понятнее, но действительно, лучше все попробовать проверить.
Корректно ли использовать конструкцию Попытка … Исключение … КонецПопытки в транзакции?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый вечер! Вопрос к практическому заданию №16
В ответе к данному заданию есть фраза:
«иначе
возможна
ошибка с сообщением, что данные уже устарели (были изменены или удалены)»
Эта оптимистическая объектная блокировка?
Сообщение при пессимистической для другого пользователя будет:
«Объект уже заблокирован»?
На скриншоте я просто хотел показать ошибку, если справочник номенклатуры у первого пользователя не проводится, то что будет у второго при попытке изменить ту же номенклатуру.
Андрей, поясните, пожалуйста, почему зачастую для регистров бухгалтерии контроль остатков не нужен?
…
(текст комментария доступен только участникам Мастер-группы)
Подскажите, в расписании со 02.03 по 09.03 — финал, а как он будет проходить? Будел ли финальное задание?
Здравствуйте, Владимир!
Финал второго потока состоится с 02.03 по 09.03. В рамках финала будет опубликовано финальное задание.
При выполнении всех обязательных заданий и финального предусмотрена выдача сертификата об успешном окончании тренинга.
Андрей, здравствуйте!
Подскажите:
в модуле 3, урок 51 «Блокировка 2-х товаров» можно или нельзя было использовать такую конструкцию:
ЭлментБлокировки.ИсточникДанных = ДокументОбъект.ТабЧасть;
ЭлементБлокировки.ИспользоватьИзИсточника(«Товар», «Товар»);
ЭлементБлокировки.УстановитьЗначение(«Склад», СкладОсновнойСсылка);
ЭлементБлокировки.УстановитьЗначение(«Склад», СкладРозницаСсылка);
Т.е. без определения ЭлементБлокировки2, сразу указать 2 склада
или скажем определить список значений складов и указать его как ИсточникДанных для ЭлементБлокировки.
И вообще, ЭлементБлокировки2 — это новая строка в таблице блокировок?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
В модуле 3. урок «Грязное чтение. Решение». На слайде, где изображена таблица с S блокировкой, в действиях второго пользователя указана S блокировка. Далее следует списание 1 шт и фиксация транзакции. А разве здесь не должна быть еще и Х блокировка, перед изменениями данных втроым пользователем.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день, Андрей.
Хочу уточнить информацию из видео 56 («Установка неявных управляемых блокировок»). При рассмотрении блокировок по РН ОстаткиТоваров вы говорите: «… блокировка будет наложена на пересечение «Основной склад», «Стул» и, т.к. характеристика здесь пустая, …, будет наложена блокировка на все характеристики…».
Но, судя по видео, значение у характеристики — пустая ссылка на соответствующий справочник. Разве не должна в этом случае блокировка накладываться на склад+стол+»пустая ссылка характеристики»?
Опыты, вроде, говорят о том же.
И в развитие темы: если измерение будет составным типом и оно не будет указано (совсем, т.е. Неопределено), то тогда блокировка пойдет на все характеристики?
Ну и немного по другой теме. Провожу документ, по точке останова останавливаю его проведение до завершения транзакции. В другой сессии пытаюсь прочесть данные этого документа (именно документа). Вылетает сообщение об ошибки превышения периода ожидания запроса на блокировку (ожидаемо) от SQL сервера (а вот это удивило). Разве при проведении (режим — управляемый, сам документ не менялся, просто перепроводится) на документ не вешается объектная блокировка на сервере 1С?
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте.
Хотелось бы уточнить вопрос, в видео «Режимы блокировки и СУБД» вы говорите что в версионных СУБД, в автоматическом режиме, уровень изоляции транзакции Read Committed, в книге «Настольная книга 1С:Эксперта» в этом случае указана Serializable. Где все же правда? Ведь в если накладывается Read Committed, то она накладывается на время запроса, она не защищает от неповторяемого чтения, может все же в видео ошибка?
…
(текст комментария доступен только участникам Мастер-группы)