Курс по Оптимизации 1С — Занятие №9

В рамках этого занятия необходимо изучить следующие материалы.

Модуль 3. Причины медленной работы

    Глава 8. Анализ причин медленной работы и оптимизация системы

    • Основные сведения о транзакциях
    • Объектные блокировки
    • Уровни изоляции и проблемы параллельной работы
    • Автоматические и управляемые блокировки
    • Особенности использования режимов блокировки

Практические задания

К сожалению, у Вас недостаточно прав для дальнейшего просмотра.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Комментарии / обсуждение (356):

  1. imagik

    1. READ COMMITTED и READ COMMITTED Snapshot. В примере для платформы 8.2 получается, что вообще никакой блокировки платформа не установила? (т.е. READ COMMITTED не была установлена?)
    а в примере для платформы 8.3 была установлена платформой блокировка READ COMMITTED Snapshot, так?
    2. Отличие READ COMMITTED от READ COMMITTED Snapshot в том, как именно они устанавливают блокировки? первая с помощью S-блокировки, вторая с помощью версионирования?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  2. imagik

    Каким образом вообще может быть «грязное» чтение, если первый пользователь установил X-блокировку? при X-блокировке вообще же не может быть даже чтения?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Andrefan

        Присоединяюсь к вопросу. Попробую переформулировать за коллегу. Ваш слайд из урока 23 (вложение). Разве у второй транзакции не должно возникать ожидания (вместо получения остатка = 0), т.к. первая транзакция установила X-блокировку на ресурс? Если на вашем примере рассматривался уровень изоляции READ UNCOMMITTED, тогда первый вопрос отпадает и возникает второй вопрос: когда данный уровень изоляции может возникать (и может ли) в информационных системах на 1С? (имеется в виду конечно же в рамках транзакции)

        %D0%93%D1%80%D1%8F%D0%B7%D0%BD%D0%BE%D0%B5%D0%A7%D1%82%D0%B5%D0%BD%D0%B8%D0%B5.JPG

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  3. imagik

    Правильно ли я понимаю, что есть блокировки СУБД и есть блокировки 1С ? тогда что будет, если порог эскалации в СУБД, например, 90 000, а в 1С 100 000 ? таблица будет вся заблокирована уже в интервале от 90тыс. до 100тыс?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  4. imagik

    Вопрос по Реализации блокировок в СУБД. Можно ли увидеть эти таблицы в СУБД, и как определить, что какой объект (в терминах 1С) заблокирован по ID ?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  5. imagik

    Вопрос по транзакциям.
    Если в обработчике события ПередЗаписью() элемента справочника уже есть неявная транзакция, то когда мы используем в обработке
    НачатьТранзакцию()
    Эл.Записать();
    ЗафиксироватьТранзакцию()
    неявная транзакция не выполняется? т.е. не будет вложенной транзакции ? или при ошибке создания одного из элементов вся транзакция будет отменена?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  6. ilyay

    Так как в 8.3 появились поля блокировки, это означает, что можно накладывать управляемые блокировки на диапазон для справочников и документов и решать проблему фантомного чтения не блокируя таблицу?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Дмитрий

        Хотелось бы уточнить по поводу не возможности фантомного чтения справочников. Есть справочник с реквизитом «Цена». Если я считаю все цены со 100 до 200 и в параллельной сессии после моего считывания добавят по этому условию еще один элемент, разве это не будет фантомным чтением?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  7. dunaev.anton

    День добрый , вопрос по 39 видео — автоматический режим

    Вопрос по проведению 20 документа — розничный склад — ласточка — шкаф , Вы говорите — «блокируется диапазон» — имеется в виду какой диапазон — по складу ? т.е. первый документ проведение которого остановлено (№22), заблокировал лишние данные в регистре остатков помимо отбора по основному складу еще и прихватил розничный ?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  8. Александр

    Доброго времени суток. Немного запутался относительно блокировок СУБД и управляемых блокировок 1С.

    Если у нас автоматический режим управления блокировкой, то все вопросы, связанные с блокировкой, решает СУБД. Тут вопросов нет: каков уровень изоляции, таков и результат.

    В управляемом режиме добавляется еще одно звено — менеджер блокировок платформы. Какова его взаимосвязь с менеджером блокировок СУБД?
    Я понял это так. В управляемом режиме на первой линии стоит 1С: если никаких (явных или неявных) управляемых блокировок не нужно, то в дело вступает СУБД и устанавливает свои блокировки.
    Иными словами, 1С берет на себя основную работу с блокировками: все ожидания, конфликты обрабатываются тут. И уже только потом, если никаких препятствий нет, в дело вступает СУБД. Это не значит, что в СУБД не может бы ожиданий, но большая их часть останется в 1С и СУБД о них не узнает.
    Пример: Транзакция 1 хочет записать данные. 1С проверяет, что никаких препятствий нет, ставит управляемую блокировку, потом СУБД ставит свою Х блокировку. Вторая транзакция тоже хочет провести какие-то манипуляции с этим объектом. 1С видит, что ресурс занят и ставит вторую транзакцию в очередь. При этом в СУБД для 2ой транзакции ничего не происходит. Когда же ресурс освободится, то 1С поставит свою блокировку, а потом СУБД свою.
    Ни в чем я не заблуждаюсь?

    Спасибо!

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  9. Roza Aleksey

    Добрый день! Имею типовую УПП 1.3 из коробки, документ расчет себестоимости выпуска. В нем есть команда «Провести вне транзакции» (Скриншот 1). Смотрю эту команду отладчиком, вижу, что вызов происходит из формы документа (скриншот 2). Сам расчет происходит в модуле объекта, родной процедуре ОбработкаПроведения(). Режим управ. блок. — Управляемый. Вопрос в следующем: в уроках сказано, что при вызове процедуры ОбработкаПроведения() неявно вызывается транзакция. Так получается, что есть разница — как вызвалась встроенная процедура и, соответственно, возникает или не возникает транзакция!? В чем разница между вызова обработки проведения через «какую-нибудь» команду и штатным механизмом «Провести»? И еще, как я могу увидеть, что транзакция началась? Спасибо!

    19cb7acf7e3e6fb3729bfb5d6b3849be.jpg2594cf41462f9cc5d4b3adad5a85dca7.jpg430b92e87010388ee4d2cb80efd02155.jpg

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Roza Aleksey

        Доброе утро! Я решил все-таки разобраться в данном вопросе поглубже. В книге Реализация прикладных задач в системе 1С:Предприятие 8.2, стр. 175, описано, что при записи документа вызванной интерактивными действиями «Провести и закрыть», «Провести» инициализируется последовательность действий ПередЗаписью() и т.д. Тут начинается транзакция. Если же мы вызываем обработку проведения неинтерактивно, то тут идет только чистый расчет обработки проведения без лишних записей документа и т.п.! Видимо, тут основная идея в том, что вместо одной большой транзакции используются несколько маленьких, возникающих при записи регистров. Видимо, получают выигрыш в скорости и параллельности работы. Хм, какой можно сделать вывод: говорить о блокировках при проведении можно, если проведение вызвано только интерактивными средствами. В других случая, их попросту нет! И другой вывод: можно рассчитать себестоимость вне транзакции! :) Как говорится, век живи — век учись! :)

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • Roza Aleksey

            Добрый день! Я приношу свои извинения, если своими словами как-то поставил под сомнение, но вы же профессор, а я студент. Я хочу разобраться в этом вопросе, чтобы в будущем мог грамотно ответить на подобный вопрос. Теперь же прошу Вас, рассмотреть мой следующий опыт: есть демо УПП 1.3.54.2. 1С:Предприятие 8.2.19.106, бд-файловая, тот же документ РасчетСебестоимостиВыпуска, ЮФО00000006. Отменил его проведение, движений нет. В общем модуле ПроцедурыРасчетаСебестоимостиРасширеннаяАналитика, строка 141, написал простое:
            а = 0; в = 1; с = в/а;
            обновляюсь, захожу в предприятие. Пытаюсь провести документ интерактивно, получаю ошибку деления на 0, движений нет. Теперь когда рассчитываю себестоимость вне транзакции (по кнопке: Провести вне транзакции), то получаю деление на 0, проведения нет, но движения остались! (скриншоты) Не понимаю, если есть единая транзакция, то такого быть просто не может, ибо это уже противоречит самой сути транзакции! Получается, что ее нет? Также функция глобального контекста ТранзакцияАктивна(), на каждой строке модуля ОбработкаПроведения() возвращает Ложь, если расчет запущен не интерактивно!
            //
            Подскажите, где тут противоречия? Где я заблуждаюсь?
            //
            И еще, Вы указали посмотреть результаты событий SQL:BatchCompleted и RPC: BatchCompleted. А что в них я должен увидеть? То есть, как из этих событий понять, что вот тут началась единая транзакция и вот тут она зафиксировалась? Спасибо!

            a367a2ce6e1b9f753402c3e2a52a8051.jpg0602c33c7ad7e90120ed675decde813d.jpg

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

  10. Roza Aleksey

    Добрый день! Допустим, я провожу документ, останавливаюсь до фиксирования транзакции. В этот момент выполняю запрос к таблице (из какой-нибудь внешней обработки), данные которой только что изменил. Получил данные по запросу и отменяю первую транзакцию. Получаю «грязные» данные. Вопрос в следующем: само выполнение запроса не накладывает ни каких блокировок, при любых режимах управления блокировками? То есть, тут не возникнет проблемы несовместимости X-блокировки и S-блокировки? Следовательно, чтобы получить «чистые» данные, мне нужно Запрос.Выполнить() обрамить в НачатьТранзакцию()/ЗафиксироватьТранзакцию()? Спасибо!

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Roza Aleksey

        Да, спасибо! Сложная тема, с ней еще нужно будет переспать!

  11. Andrefan

    Добрый день!
    Правильно ли я понял, что в момент проведения документа (режим управляемых блокировок) использование объекта БлокировкаДанных избыточна? Ведь и так блокируются только записи, соответствующие измерениям регистров из коллекции движения документа? Если я не прав, приведите, пожалуйста, пример.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  12. bas

    Андрей, добрый день!

    Подскажите, пожалуйста, можно ли как-то отследить эскалацию блокировок на уровне 1С?

    Например в MS SQL Profiler есть соответствующее событие.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  13. Andrefan

    Добрый день! Вопрос про Х-блокировку. Правильно ли я понял: в момент такой блокировки (запись справочника, проведение документа и т.д.) любая работа с таблицами СУБД (чтение, запись) невозможна и будет вставать в очередь?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  14. Eugeeny

    Добрый день, Андрей.
    Как поведет себя система, если первая транзакция заблокирует ресурс X-блок., вторая транзакция к этому ресурсу обратится, уйдет в ожидание на стандартные 20 секунд, а первая через 3 секунды, после начала ожидания второй транзакции, освободит ресурс. Прервется ли ожидание второй или она будет ждать еще 17 секунд?
    И если вторая будет ждать, то сможет ли в это интервал времени третья транзакция заблокировать этот же ресурс?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  15. Lidiya_Sh

    Андрей,
    В управляемом режиме например при получении остатков если использовать конструкцию «для изменения» это не вызывает исключительную блокировку и также может привести к отриц. остаткам?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  16. leshiy26

    Устанавливаются ли какие-то блокировки в автоматическом режиме, если в запросе не используется ключевое слово ДЛЯ ИЗМЕНЕНИЯ?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  17. evgenylavelin

    День добрый, Андрей.

    Не совсем понятен мне объект БлокировкаДанных.

    Экспериментирую с этим объектом:

    НачатьТранзакцию();

    Блокировка = Новый БлокировкаДанных;

    ЭлементБлокировки = Блокировка.Добавить("Справочник.Номенклатура");
    ЭлементБлокировки.УстановитьЗначение("Ссылка", Справочники.Номенклатура.НайтиПоКоду("1"));

    ЭлементБлокировки = Блокировка.Добавить("Справочник.Контрагенты");
    ЭлементБлокировки.УстановитьЗначение("Ссылка", Справочники.Контрагенты.НайтиПоКоду("2"));
    Блокировка.Заблокировать();

    ЭлементБлокировки = Блокировка.Добавить("Справочник.Номенклатура");
    ЭлементБлокировки.УстановитьЗначение("Ссылка", Справочники.Номенклатура.НайтиПоКоду("3"));

    Блокировка.Заблокировать();

    Блокировка = Неопределено;

    Блокировка = Новый БлокировкаДанных;

    ЭлементБлокировки = Блокировка.Добавить("Справочник.Номенклатура");
    ЭлементБлокировки.УстановитьЗначение("Ссылка", Справочники.Номенклатура.НайтиПоКоду("4"));

    ЭлементБлокировки = Блокировка.Добавить("Справочник.Контрагенты");
    ЭлементБлокировки.УстановитьЗначение("Ссылка", Справочники.Контрагенты.НайтиПоКоду("5"));
    Блокировка.Заблокировать();

    ЗафиксироватьТранзакцию();

    В результате в рамках транзакции блокируются все 5 объектов: 3 номенклатуры, 2 контрагента.

    Для чего дана возможность создания нескольких коллекций типа БлокировкаДанных?
    Как это можно использовать?
    Когда может потребоваться (или когда необходимо) создать одновременно несколько коллекций БлокировкаДанных?

    P.S. Ведь можно было сделать одну коллекцию и добавлять туда элементы блокировки (например, БлокировкиИнформационнойБазы, по аналогии ПользователиИнформационнойБазы).

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  18. Simol

    А как Вы посоветуете бороться в 8.2 конфигурация на управляемых блокировках с грязным чтением в такой ситуации:
    В ПередЗаписью документа производится запись в регистр сведений и до выполнения записи документа в другом сеансе уже видят измененный регистр сведений, но документ еще не изменен.
    В 8.3 уже версионирование и грязных нет.

    А 8.2+управляемые как быть, чтобы запросом не получили грязные данные?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Simol

        Но на сколько я понял это не защитить от чтения запросом. Получается там перед запросом нужно управляемо блокировать все документы и регистры, которые я хочу прочесть?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  19. andreyka

    Андрей, скажите пожалуйста, правильно ли я понял, что ели использовать базу на версионной СУБД в режиме автоматических блокировок, то можно получить проблему отрицательных остатков? Будет блокироваться вся таблица целиком, но уровень изоляции Read Committed, что не решает проблему неповторяемого чтения?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  20. Nikolayp

    Добрый день, Андрей.
    Возник вопрос, относительно Read Committed Snapshot.
    Будет ли работать это в связке:
    SQL2008+1C 8.3 (в реж. совместимости 8.2.16) управляемый режим блокировок.
    Ранее при использовании SQL2005+1C 8.2 (автоматический режим) испытывали не реальные проблемы с блокировками.
    С обновлением СУБД и платформы, стало пошустрее работать и блокировки ушли, но к сожалению, последнее время периодически снова возникают проблемы с блокировками, не проводятся документы.
    Конф. УПП 1.2.19.1 (не типовая).
    Спасибо.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Игорь

        Я попробовал выполнить этот запрос на стандартной БП 3.0:

        snapshot_isolation_state_desc: OFF
        is_read_committed_snapshot_on: 1

        Я так понимаю, что Read Committed Snapshot = 1, значит включен этот режим. А вот что значит OFF?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • Игорь

            Андрей спасибо за ответ и за ссылку.
            Но я так и не понял, конкретно в моем случае, Read Committed Snapshot включен или нет? :)

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

  21. Simol

    Добрый день, Андрей!
    Скажите есть ли где-то актуальные методики по использованию настроек документов, последовательностей, регистров.
    Например из Ваших уроков выходит, что нужно:
    1) Удалять движения при отмене проведения
    2) Разделение итогов по регистрам, по котором не проверяются остатки при проведении
    3) В последовательности не изменять граница при проведении
    И соответственно кроме выставления этих свойств дорабатывать код конфигураций.

    А какие еще есть актуальные рекомендации по свойствам объектов, которые либо добавили либо дополнили новые значения, направленные на увеличение параллельности?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Simol

        Спасибо за напоминание про ИТС :)
        Читаю статью http://kb.1c.ru/articleView.jsp?id=45
        Раздел «Блокирующее чтение остатков в начале транзакции»

        Рекомендуют записать движения по регистрам, не требующим проверки остатков в начале транзакции, затем делаем нужное, затем записываем движения, требующие проверки остатков, затем проверяем остатки.

        А почему нужно явно записать движения по регистрам, не требующие проверки остатков, почему это не оставить на неявную запись в конце обработки проведения?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  22. Simol

    Добрый день, Андрей!
    Скажите, правильно ли я понял, что в 8.3 на MS SQL «грязное чтение» уже невозможно за счет версионирования?
    Правильно ли я понял, что при версионировании читаются только данные зафиксированных транзакций и свои незафиксированные?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  23. adelpieroff10

    Здравствуйте! Попробовал проверить какие блокировки устанавливаются при чтении запросом, получении объекта и чтении набора записей. Так вот, чтение наборов записей устанавливает управляемую блокировку не только в транзакции, но и при чтении без транзакции. Соответственно
    1. Вроде в уроках говорили, что блокировки вне транзакций не существуют.
    2. Общий вопрос — то, что разделяемая управляемая блокировка держится до конца транзакции — это всегда?

    • adelpieroff10

      Вот еще что непонятное для себя нашел, можете пояснить?
      Первый сеанс устанавливает исключительную блокировку на регистр:
      НачатьТранзакцию();
      Блокировка = Новый БлокировкаДанных;
      ЭлБлокировки = Блокировка.Добавить(«РегистрНакопления.Остатки»);
      ЭлБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
      Блокировка.Заблокировать();
      ЗафиксироватьТранзакцию();

      Точку останова под первым сеансом поставил в строке ЗафиксироватьТранзакцию().

      Второй сеанс читает набор записей заблокированного регистра:

      НачатьТранзакцию();

      Набор = РегистрыНакопления.Остатки.СоздатьНаборЗаписей();

      Набор.Прочитать();

      ЗафиксироватьТранзакцию();

      Вроде как в момент чтения должна была установиться разделяемая блокировка, и потому возникнуть ожидание из-за первого сеанса, но никакого ожидания нет, процедура отрабатывает.

      • Андрей Бурмистров

        …
        (текст комментария доступен только участникам Мастер-группы)

        • adelpieroff10

          Пробовал наложить отбор по регистратору, потом читать — результат тот же, могу провести операции параллельно.

          • Андрей Бурмистров

            …
            (текст комментария доступен только участникам Мастер-группы)

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • adelpieroff10

        А в профайлере каким событием это можно увидеть?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  24. Simol

    Добрый день, Андрей!
    Вроде старался слушать именно уроки по этому заданию, но тем не менее был ошарашен решением 23 задания. Подскажите ,в каком уроке рассказывалось про БлокироватьДляИзменения?

    P.S. В 10-м уроке рассказано. Скорее это задание больше к 10-му относится.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  25. Simol

    Добрый день, Андрей!

    Скажите, а есть мануал по переводу конфигурации на управляемые блокировки?
    Интересует перечень ситуаций, когда нужно делать явные блокировки.
    Я уже определенные ситуации осознал, но не могу понять на сколько я все ситуации охватил и не сделал ли лишних выводов.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  26. povmen

    Добрый день, Андрей!

    Вопрос по видеоуроку №28.
    «Каким образом мы здесь исключим грязное чтение».

    В таблице приведен пример действий двух пользователей.
    Но, если предположить все то же самое, только пользователь №1 (Транзакция 1) не отменяет транзакцию, а успешно заканчивает списанием единицы товара и снимает Х блокировку. Пользователь №2, прочитавший к этому времени остатки (версию до изменения пользователем №1) будет уверен, что тоже может списать единицу товара. Ставит Х блокировку, списывает, снимает Х блокировку и имеем отрицательные остатки?

    Получается, что уровень изоляции Read Committed Snapshot не может быть применен для решения проблемы «Грязных остатков» для приведенного примера, ибо может быть проблема отрицательных остатков? Или я чего-то не уловил в примере (между строк :) )

    1.Отсюда вопрос: кто или что, в какой момент, в каких случаях решает какой уровень изоляции устанавливать для транзакции?

    2.Устанавливая управляемые блокировки, можем мы знать точно, какой уровень изоляции будет выбран для транзакции?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  27. Роман Агальцев

    Андрей, добрый день.

    Известно ли, где и в каком виде хранится таблица управляемых блокировок? Можно ли ее каким-то способом просмотреть?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  28. Eugeeny

    Здравствуйте, Андрей.
    В случае если больше 2 пользователей обратились к одному и тому же ресурсу, будет ли выполняться очередность выполнения транзакций? Например, первая транзакция заблокировала ресурс, после вторая транзакция стала ожидать, далее третья, четвертая. После того как первая освободит ресурс, ожидающие транзакции получат доступ в порядке их поступления или нет?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  29. andreyka

    Андрей, скажите, правильно ли я понял, что ели использовать базу на версионной СУБД в режиме автоматических блокировок, то можно получить проблему отрицательных остатков? Будет блокироваться вся таблица целиком, но уровень изоляции Read Committed, что не решает проблему неповторяемого чтения?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  30. bas

    Андрей, добрый день!
    Подскажите, пожалуйста:
    1. Обратил внимание, что при использовании объекта БлокировкаДанных есть возможность указывать поле Период регистров, в т.ч. диапазон дат. Это используется в типовых конфигурациях, например, в Бухгалтерии предприятия при проведении документа РеализацияТоваровУслуг: ЭлементБлокировки.УстановитьЗначение(«Период», Новый Диапазон(,МоментВремени.Дата). В каких случаях нужно дополнительное «уточнение» блокировки по полю Период? Следовало ли сделать нечто подобное в уроке по переводу документа «Продажа» в упр. режим при контроле остатков?
    2. Правильно я понимаю, что при использовании режима блокировок «Автоматический и управляемый» платформа будет накладывать те же неявные управляемые блокировки, что и в режиме «Управляемый», независимо от режима блокировки для объекта метаданных/транзакции?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  31. adelpieroff10

    Здравствуйте! Вопросы по заданию №23:
    1. В момент очистки набора записей регистра остатков ( Движения.ОстаткиТоваров.Очистить()) должна налагаться эксклюзивная x-блокировка? У меня стоит режим упр. блокировками в конфигурации — автоматический и управляемый, для документа Продажи — управляемый, для всех связанных с ним объектов — тоже. В итоге после прохождения отладчиком строки очистки старого набора записей блокировки нет — могу провести другие док-ты по этим же ресурсам параллельно.
    2. Самое интересное в другом — в момент прохождения отладчиком строки Движения.ОстаткиТоваров.Записать() я все равно могу записывать новые документы по этим же ресурсам, т.е блокировка как будто не накладывается, с чем это связано?
    3. А вот пока отладчик стоит на месте, открыть проводимый документ или скопировать его я не могу — вываливается таймаут.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • adelpieroff10

            Точку останова ставил после записи. Нашел разницу — если предварительно не отменять проведение, то могу провести 2 документа параллельно. А вот если отменить проведение, то уже не могу. Можете объяснить почему в первом случае блокировка не накладывается?

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

  32. Eugeeny

    Здравствуйте, Андрей.
    Хотелось бы подытожить еще раз. В каких случаях неявная управляемая блокировка сработает наверняка и когда нужно самому поставить блокировку явную? Зависит ли это от версии платформы 1с?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  33. StaticUnsafe

    Здравствуйте. Интересует ситуация, когда накладываются две совместимые управляемые блокировки по одинаковым полям. Что означает «блокировка будет поглощена» ?
    Например, первую блокировку установили какое то время назад и она скоро снимется, т.к. закончится транзакция которая её породила. В этот момент возникает такая же блокировка и она тоже должна продлиться какое то время, и пока первая не кончилась «она будет поглощена». Правильно ли я понимаю, что когда исчезнет первая блокировка, вступит в силу «поглощенная» до конца своей транзакции?

    PS. В видео слово поглощена написано как поглАщена, это орфографическая ошибка.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • StaticUnsafe

        Спасибо.
        Другой вопрос. Было показано, что платформа наложит неявную управляемую блокировку в обработке проведения по данным из коллекции движений объекта.
        В обработке проведения мы заполняем эти движения.

        Мы последовательно добавляем строки в наборы, заполняем их. В какой именно момент платформой будет наложена эта неявная блокировка?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  34. adelpieroff10

    Вопрос к проблеме неповторяемого чтения — а когда может возникнуть необходимость читать данные два раза в одной транзакции?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • Simol

        Скорее имеется в виду не явное чтение второй раз, а нужно быть уверенным, что после чтения до окончания транзакции прочитанные данные в базе не изменились, а это бывает важно, если вы на основании этих данных что-то рассчитали.
        Например получили список складов с реквизитом Розничный и пока дальше что-то делали в транзакции кто-то зашел и у склада изменил этот реквизит

        • Simol

          Ага, разобрался с неповторяемым чтением.
          Это может быть неявно.
          Например в начале проведения получили значение:
          Наименование = Контрагент.Наименование;
          И потом используем не полученное наименование, а получаем заново.
          И если в серединке в другом сеансе изменят наименование, то и получится эта ошибка.

          Вывод: Получать данные 1 раз и потом уже использовать полученное значение.

  35. spidem

    Можно ли каким-то образом узнать, с каким уровнем изоляции работает 1С 8.2 база на SQL2008R2?

    Включен ли READ COMMITED SNAPSHOT или используется READ COMMITED?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  36. adelpieroff10

    Здравствуйте! Каким образом определяются соседние записи таблицы при уровне изоляции Serializable, если таблица — регистр?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • adelpieroff10

        В видео 46 — Особенности установки упр. блокировок при чтении — Вы показываете пример чтения набора записей и того, что в этом случае блокировка на таблицу остатков по регистратору держится до конца транзакции. Но вроде бы выше говорили, что в управляемом режиме уровень изоляции транзакции — Read Committed, значит вроде как блокировка на чтение должна сниматься сразу после чтения?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

      • adelpieroff10

        Еще один вопрос — в 8.3 Вы демонстрируете установка блокировки по объектным сущностям по реквизитам (на примере справочника). В ролике во время удержания блокировки нельзя добавить новый элемент, удовлетворяющий полям блокировки (цена = 200). Попробовал в 8.2 на необъектных сущностях повторить эксперимент — заблокировал регистр по складу, затем попытался добавить новый документ по этому складу, документ провелся. В ролике — это особенность 8.3 или особенность полей блокировки в объектных сущностях?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  37. adelpieroff10

    Здравствуйте!
    1) Таблица блокировок в СУБД — это одна таблица на всю базу? Или их несколько?
    2) В таблице блокировок пользователь — это именно пользователь или сеанс?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  38. andreyka

    Сам ответил на свой вопрос :) Комментарий можно удалить.

  39. igor@kozlitin.net

    Андрей,

    Есть вопрос по поводу решения практического задания 23. Вы не прокомментируете фразу «если в регистре включено разделение итогов, нужно поставить набору записей свойство
    БлокироватьДляИзменения=Истина»?
    Ведь на первый взгляд при проведении списания по новому алгоритму при записи наложится исключительная управляемая блокировка на записываемые в регистр строки и это должно предотвратить изменение этих записей до проверки остатков на отрицательность.
    Разделение же итогов, на мой взгляд, относится на уровень ниже по сравнению с объектами, которыми оперирует менеджер блокировок.
    Что тогда нам дает установка свойства БлокироватьДляИзменения=Истина?
    Заранее спасибо за ответ.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • alexlap

        А есть ли тогда противопоказания к использованию разделения итогов в автоматическом режиме блокировок? Когда и кем например определяется значение разделителя?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  40. igor@kozlitin.net

    Андрей,

    Хотел задать такой вопрос. В обсуждении на одном форуме человек считал, что его отчеты устанавливают блокировки и это влияет на производительность. На что я обратил внимание, что если отчеты выполняются вне транзакции, то и блокировки они не устанавливают. Другой участник заметил, что «если при использовании построителя отчета (например, универсального отчета из УПП) задать отборы или группировки по периодам, то запрос выполняется в транзакции и соответственно устанавливает блокировки на ресурсы». У Вас нет информации на этот счет? Т.е. когда 1С в отчетах может устанавливать блокировки даже если пользователь специально не выполняет отчет в транзакции? Спасибо.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • igor@kozlitin.net

        Спасибо за ответ. Скажите, а событие TLOCK в технологическом журнале отрабатывает одинаково как для автоматического режима блокировок так и для управляемого?

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • wonrims

            Этот вопрос включили в сборник 1с:Профессионал, звучит так: Ошибки блокировок при формировании отчета возможны:
            Правильный ответ —
            Возможны, например, при использовании построителя отчета, если отчету требуется согласованные данные (например по неделям), он будет выполняться в транзакции.
            Так что, видимо, на форуме говорили верно, но нужно проверить.

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

      • GilevSlava

        любой запрос выполняется в транзакции в субд, тут нужно смотреть на уровень изоляции
        я точно не помню версию платформы, но с какой то версии изменился уровень изоляции для «Отчетов» и «списков»
        точнее можно проверить через профайлер

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

  41. konst5

    Здравствуйте!
    После просмотра осталась пара вопросов.

    Правильно ли я понимаю, что установить блокировку по пустому значению не получится? Мне нужно заблокировать данные по Склад1 + Товар1 + ПустаяХарактеристика. Если я поставлю такую блокировку, то заблокируются данные Склад1 + Товар1 + ВсеХарактеристики?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  42. Михаил Козлов

    Андрей, здравствуйте. Вопрос по курсу. В видео «25. Грязное чтение. Решение» Вы показывали таблицу, где в транзакции 2 для чтения актуальных остатков устанавливалась S блокировка. На слайде показывалось, что S блокировка снималась после чтения. Следующим шагом было списание товара, а потом фиксация транзакции. Но разве для списания не нужно было установить кратковременную X-блокировку, или списание не является действием изменения с данными (товаром), а уменьшает лишь их количество?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  43. Антон Познянский

    В уроке 37. рассматривается уровень изоляции транзакций Read Uncommited. Говорится что используется при чтении вне транзакции, но если чтение вне транзакции тогда получается и изолировать нечего, т.е. свойства указанные в уроке 3. тоже не действуют. По моему запутался в терминах, поясните пожалуйста.

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  44. imagik

    и еще, теперь постоянно выдается сообщение
    {Обработка.ПанельФункций.Форма.Форма.Форма(3385)}: Ошибка при вызове метода контекста (Установить)
    Константы.ГотовностьПрограммыКРаботе.Установить(ХранилищеЧеклиста);
    по причине:
    Lock conflict during transaction:
    Maximum idle time for lock access has been exceeded due to the wait for the session

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  45. imagik

    Добрый день.
    Последнее время постоянно возникает ошибка
    Lock conflict during transaction:
    Maximum idle time for lock access has been exceeded due to the wait for the session
    С чем это может быть связано? и как лечить?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  46. gosn1ck

    Андрей, подскажите, пожалуйста, с чем может быть связано значительное увеличение времени на запись и чтение в частности регистров сведений при переводе конфигурации с режима автоматического на автоматический и управляемый. режимы у документов и регистров не менялись?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

      • gosn1ck

        у нас вообще версия 8.1 :( проблема очень «остро чувствуется» как вы и сказали при записи большого объема строк. конечно мы предполагали, что возникнут дополнительные затраты, но не на столько же …

        • Андрей Бурмистров

          …
          (текст комментария доступен только участникам Мастер-группы)

          • gosn1ck

            спасибо, а речь о платформе или режим совместимости конфигурации также надо установить в «не использовать» ?

            • Андрей Бурмистров

              …
              (текст комментария доступен только участникам Мастер-группы)

  47. gosn1ck

    Добрый день, а почему в занятии №8 крайнее ДЗ №14, а в занятии №9 первое ДЗ — 22ое? а где с 15 по 21 включительно?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  48. a.bushmin

    Насколько я понимаю, при управляемых блокировках не должно возникать (в идеале) сообщений об ошибке блокировки от СУБД: ошибки о блокировке должны быть только от платформы. То есть в реальной жизни сообщения о блокировках от СУБД свидетельствуют о проблемах: избыточные блокировки, неоптимальные индексы и т.д. Иными словами, получение сообщения о блокировке от СУБД означает следующее: платформа считает, что этот объект не заблокирован и пытается изменить его в базе. Но этот объект уже заблокирован на уровне СУБД по причине всяких там неоптимальностей. Следовательно, надо искать и устранять причины, и это в принципе возможно.
    Вопросы следующие: а) правильно ли я рассуждаю; б) в уроках говорилось что это (сообщения о блокировках от СУБД) иногда допустимо – просьба немного конкретизировать в каких случаях.

    P.S. Вопрос навеян расчетом себестоимости в УПП. В результате открыл для себя (а главное, понял почему :) ), что предварительное распроведение сильно упрощает ситуацию (пользователи хоть как-то могут работать).

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

    • GilevSlava

      в упп при использовании партионного учета сообщение об ожидании на блокировках это нормальная ситуация, так как алгоритм требует монопольного изменения данных и заставляет всех ждать
      вы конечно можете постараться и добиться «только блокировок от 1С», но только они все равно будут заставлять последовательно пользователей изменять регистр «партий»

      если у Вас партии списываются при проведении, то попробуйте сделать списание партий офлайн допроведением документов только одним пользователем (сам с собой он блокироваться не будет)

      отдельная тема это «перепроведение» документов, так как при очистке движений легко поймать избыточную блокировку, обязательно смотрите план запроса такой «очистки движений»

  49. fedey

    25 задание
    в ответе сказано, что при ПолучитьОбъект() будет установлена разделяемая управляемая блокировка. Вроде платформа ставит разделяемые управляемые блокировки только при объектном чтении необъектынх сущностей причем до конца транзакции. Правильно ли дан ответ?

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

  50. crabzzy

    Добрый день, в пр.задании 22 в п.3 синт.ошибка Справочники должны быть во множественном числе и поиск идёт по справочнику Товаров, хотя ищем «Основной»

    • Андрей Бурмистров

      …
      (текст комментария доступен только участникам Мастер-группы)

Комментарии закрыты