Как работают блокировки 1с
Объем информации в информационных системах постоянно растет, что влечет увеличение времени доступа к данным. Для соблюдения достоверности получаемой информации существует механизм блокировки данных. Раньше управлять блокировками 1С было практически невозможно, но в 1С 8.1 эту ситуацию исправили – появился механизм управляемых блокировок. При этом также осталась возможность отдать управление на усмотрение СУБД (автоматический режим). При использовании данного режима достигается высокая параллельность использования определенных данных и сокращается время ожидания. Разработчик может выбрать один из следующих типов:
Разделяемая блокировка 1С устанавливается для того, чтобы данные не были изменены другими транзакциями. Исключительная блокировка, помимо этого, обеспечивает запрет не только изменения этих данных, но даже их чтения другими транзакциями, устанавливающими управляемые блокировки. Можно сказать, что исключительная управляемая блокировка является средством борьбы с конфликтами блокировок (deadlock) и может использоваться аналогично ключевому слову для изменения языка запросов (используется в режиме автоматических блокировок).
Исключительная блокировка в 1С используется в том случае, когда нам необходимо сделать изменение данных, зная их предыдущее состояние, т.е. в течение времени транзакции недопустимо изменение необходимых нам данных.
2. Проведение приходных и расходных накладных
Исключительная блокировка 1С в отличии от разделяемой носит большую временную нагрузку для системы, ведь при разделяемой одни и те же файлы данных 1С можно записать одномоментно. Например, при одновременном проведении приходных накладных нам не важен контроль остатков, т.к. движения итак плюсовые.
Но при проведении расходной накладной нам не обойтись без исключительной блокировки 1С для соблюдения достоверности данных. В момент проведения данные по остаткам не должны быть доступны другим транзакциям.
3. Установка блокировки в коде
В коде установка блокировки выглядит следующим образом:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "РегистрНакопления.ОстаткиНоменклатуры";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Номенклатура", Справочники.Номенклатура.НайтиПоНаименованию("Яблоко")); //поиск по наименованию в целях примера
ЭлементБлокировки.УстановитьЗначение("Свойство", Справочники.Свойства.НайтиПоНаименованию("Красное")); //поиск по наименованию в целях примера
Блокировка.Заблокировать();
При установке блокировки важно понимать, какой минимум блокируемых данных нам необходим, ведь в случае блокировки избыточного количества данных мы увеличиваем вероятность ожидания этих данных другими транзакциями данных.
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Периодически приходиться разбираться в применении механизмов блокировок в тех или иных случаях для реализации различных задач. Хотя информации на эти темы достаточно много, она сильно разрознена и со временем начинает забываться тот ворох материала, который пришлось перелопатить. Приходится разбираться заново…
В итоге, появилась идея структурировать и кратко изложить суть различных режимов блокировок в 1С в целом и применительно к типовым конфигурациям. Надеюсь, это будет полезно.
Сперва напишу про уровни изоляции транзакций, кратко рассмотрю только те уровни, которые имеют отношение к данной статье.
Уровни изоляции транзакций
Read committed (чтение завершенных) - разрешено чтение данных в транзакции, изменения по которым были завершены всеми остальными транзакциями. По умолчанию используется для большинства баз данных.
Read committed Snapshot (версионирование данных) - разрешено чтение старой версии данных, изменения по которым не завершены другими транзакциями. Штатно поддерживается базами данных: Postgre SQL и Oracle. Начиная с версии платформы 1С 8.3 реализован для работы с базами данных: MSSQL .
Repeatable read (повторяемое чтение) – запрет на изменение записей в транзакции, которые уже были считаны ранее в рамках остальных транзакций.
По поводу изоляции транзакций пока все, далее хочется сказать пару слов про механизм разделения итогов в регистрах накопления.
Разделение итогов регистров накопления
Регистр накопления на уровне базы данных состоит из двух таблиц: Основная таблица и Таблица итогов. Во время записи в регистр (как по приходу так и по расходу) происходит запись данных в обе таблицы, в основную таблицу записываются непосредственно данные, в таблице итогов обновляется итоговая строка по набору измерений регистра. Соответственно, при работе параллельных транзакций запись в таблицу итогов по одному набору измерений не может быть выполнена одновременно, что понижает скорость проведения документов.
Для исключения этой проблемы создан механизм – разделение итогов. Не вдаваясь в подробности, данный механизм позволяет обновлять данные в таблице итогов регистра накопления по одному и тому же набору измерений, одновременно.
Для раскрытия основной темы статьи, мне потребуется описать общие принципы механизмов контроля остатков, которые применяются в типовых конфигурациях. Если коротко, существует старый и новый механизмы контроля, причем оба применяются на текущий момент, несмотря на то, что новому режиму уже около 8 лет.
Механизмы контроля остатков в типовых конфигурациях 1С
Старая схема, далее OLD – формируется запрос к базе данных для выполнения контроля свободных остатков, в случае положительного решения, формируется движение по регистру. На данный момент применяется в Бухгалтерии 3.0 и в некоторых алгоритмах УТ 11, КА 2, ЕРП 2.
- необходимо блокировать записи, которые участвуют в движении уже в момент их прочтения, что ухудшает параллельность работы.
Новая схема, далее NEW – выполняется движение по регистру, затем проверяется наличие отрицательных остатков, в случае их наличия, операция откатывается. На данный момент применяется в УТ 11, КА 2, ЕРП 2.
Преимущества:
- не нужно удалять движения документа отдельной операцией, данные перезаписываются без предварительной записи пустых наборов. Это серьезно увеличивает скорость проведения документа.
- повышена скорость выполнения запроса к остаткам, так как в большинстве случаев, запрос после проведения выдает пустой результат.
- Нет необходимости предварительной блокировки изменяемых данных.
- в случае, если для выполнения проведения необходимо получать данные из регистров учета (например расчет себестоимости для списания), в любом случае необходимо блокировать записи уже в момент их прочтения.
Резюмируя выше написанное, можно сделать вывод - если для проведения документа не требуется делать дополнительных запросов к регистрам базы данных, лучше применять новый механизм, если это необходимо – применяем старый механизм.
Ну что, настало время перейти, собственно, к изложению основной темы даной статьи – описание режимов блокировок. На самом деле, режимов всего два: Автоматический и Управляемый, они указываются в общих свойствах конфигурации, уверен, что все это прекрасно знают, поэтому не останавливаюсь на этом подробно.
Вы уже наверно догадались, что работать с этими двумя режимами необходимо по разному применительно к разным механизмам проведения документов. Разберем это более подробно.
Режим автоматических блокировок
В данном случае используется описанный выше режим изоляции транзакций: Repeatable read .
Примечание: в данной статье рассматривается преимущественно клиент серверный вариант работы. Для файлового режима будет применяться еще более высокий уровень изоляции, который здесь рассматривать не будем.
Для исключения взаимоблокировок при проведении документов с контролем остатков - OLD применяется конструкция языка запросов «ДЛЯ ИЗМЕНЕНИЯ», позволяющая при первом чтении данных в транзакции наложить на эти данные не разделяемую блокировку на чтение, а блокировку обновления. Соответственно, в другой транзакции уже будет невозможно выполнить подобную процедуру, так как наложить на одни и те же данные две блокировки обновления из разных транзакций нельзя.
Блокировка накладывается только на те записи, которые фигурируют в запросе (в худшем случае, при неоптимальном плане запроса или некорректном его написании может быть заблокировано больше записей, чем необходимо).
Примечание: В случае работы с файловой базой и с P postgre SQL , блокировка накладывается целиком на всю таблицу.
Использовать режим контроля остатков - NEW совместно с автоматическим режимом блокировок имеет смысл только для регистров без разделения итогов, в этом случае, никаких дополнительных действий делать не нужно. При использовании регистров с разделением итогов может возникнуть d ea dlock на чтении данных, если запись в регистр производилась одновременно, и каким-то образом решить данную проблему не получится.
Режим управляемых блокировок
В данном случае, применяется режимы изоляции транзакций: Read committed и Read committed Snapshot .
Использование режима контроля остатков OLD - разделяемая блокировка снимается после прочтения данных об остатках, поэтому, чтобы исключить возможность возникновения отрицательных остатков, необходимо выполнить блокировку необходимых записей в регистре явно до формирования запроса на получение остатков. Собственно, в этом и состоит принцип управляемого режима блокировок.
Использование режима контроля остатков NEW :
В случае использования регистров без разделения итогов дополнительные блокировки к наложенными базой данных не нужны, СУБД сама заблокирует необходимые данные (в данном случае записи в таблице итогов регистра накопления).
В случае использования регистров накопления с разделением итогов (по умолчанию к конфигураторе создаются регистры именно с данным флагом) можно получить следующие негативные ситуации:
- Без режима версионирования (MS SQL и 1С 8.2) – получим взаимоблокировку при попытке чтения данных, если запись в двух транзакциях была выполнена одновременно. При записи данных блокировка не будет возникать, так как используются разные строки СУБД (разделение итогов)
- С режимом версионирования Snapshot (postgresql,oracleили 1С 8.3) – блокировка возникать не будет, но будут появляться отрицательные остатки, так как контроль будет выполнен без учета всех не завершенных транзакций.
Для исключения подобной ситуации необходимо перед записью в регистр установить флаг набора записей: БЛОКИРОВАТЬ ДЛЯ ИЗМЕНЕНИЯ. Данная конструкция дает команду при записи накладывать исключительную блокировку на записи таблицы остатков регистра без учета разделителя итогов, по своей сути, она просто напросто временно отключает разделение итогов для регистра накопления.
Соответственно исключается возможность параллельной записи в регистр данных с аналогичным набором измерений, более поздняя транзакция будет ожидать завершение предыдущей.
Надеюсь, данная статья была полезной, и после ее прочтения создается более целостное понимание работы платформы 1С при различных режимах блокировок, используя разные механизмы контроля остатков.
Если что-то упустил и в чем-то был не точен, буду руд увидеть это в комментариях к статье.
Отдельное огромное спасибо, если отметите статью звездочкой, так как не что так не мотивирует на написание новых статей, как Ваше одобрение J
Сегодня речь пойдет о блокировках как на уровне 1С 8.3 и 8.2, так и на уровне СУБД. Блокировка данных — обязательный элемент любой системы, количество пользователей в которой больше одного.
Ниже я распишу, как работают блокировки, и каких типов они бывают.
Блокировка — это информация о том, что ресурс системы захвачен другим пользователем. Бытует мнение, что блокировка — это ошибка. Нет, блокировка — это неизбежная мера в многопользовательской системе для разделения ресурсов.
Вред системе могут принести только избыточные («лишние») блокировки, это те блокировки, которые блокируют лишнюю информацию. Такие блокировки необходимо научиться устранять, они могут привести к неоптимальной работе системы.
Типы блокировок 1С
Блокировки в 1С делятся условно на объектные и транзакционные.
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Объектные бывают, в свою очередь, оптимистическими и пессимистическими. А транзакционные можно разделить на управляемые и автоматические.
Объектные блокировки 1С
Данный вид блокировок полностью реализован на уровне платформы 1С и никак не затрагивает СУБД.
Пессимистические блокировки
Эта блокировка срабатывает, когда один пользователь что-то изменил в форме справочника, а второй пытается так же изменить объект в форме.
Оптимистические блокировки
Данная блокировка сравнивает версии объекта: если два пользователя открыли форму, и один из них изменил и записал объект, то второму при записи система выдаст ошибку, что версии объектов отличаются.
Транзакционные блокировки 1С
Механизм тразакционных блокировок 1С гораздо интереснее и более функционален, чем механизм объектных блокировок. В этом механизме активно участвуют блокировки на уровне СУБД.
Неверная работа транзакционных блокировок может привести с следующим проблемам:
- проблема потерянного изменения;
- проблема грязного чтения;
- неповторяемость чтения;
- чтение фантомов.
Подробно эти проблемы были рассмотрены в статье об уровнях изоляции транзакции.
Автоматические транзакционные блокировки 1С и СУБД
В автоматическом режиме работы за блокировки целиком и полностью отвечает СУБД. Разработчик в данном случае абсолютно не участвует в процессе. Это облегчает труд программиста 1С, однако создание информационной системы для большого количества пользователей на автоматических блокировках нежелательно (особенно для СУБД PostgreSQL, Oracle BD — при модификации данных они полностью блокируют таблицу).
Для разных СУБД в автоматическом режиме используются разные степени изоляции:
- SERIALIZABLE на всю таблицу – файловый режим 1С, PostgreSQL, Oracle;
- SERIALIZABLE на записи – MS SQL, IBM DB2 при работе с не объектными сущностями;
- REPEATABLE READ на записи – MS SQL, IBM DB2 при работе с объектными сущностями.
Управляемые режим транзакционных блокировок 1С и СУБД
В режиме управляемых блокировок всю ответственность на себя берет разработчик прикладного решения на уровне 1С. При этом СУБД устанавливает достаточно высокий уровень изоляции для транзакций — READ COMMITED (SERIALIZABLE для файловой СУБД).
При выполнении любой операции с БД менеджер блокировок 1С анализирует возможность блокировки (захвата) ресурса. Блокировки одного и того же пользователя всегда совместимы.
Две блокировки НЕ совместимы, если: установлены разными пользователями, имеют несовместимые виды (исключительная/разделяемая) и установлены на один и тот же ресурс.
Физическая реализация блокировок в СУБД
Физически блокировки представляют собой таблицу, которая находится в БД под названием master. Сама таблица блокировок носит имя syslockinfo.
Таблица условно имеет четыре поля:
- ИД блокирующей сессии SPID;
- что именно заблокировано RES ID;
- тип блокировки — S,U или XMODE (на самом деле в MS SQL их 22 типа, однако в связки с 1С используется только три);
- состояние блокировки — может принимать значение GRANT (установлена) и WAIT (ожидает своей очереди).
Для завершения транзакции на уровне SQL можно использовать команду KILL с указанием идентификатора сессии:
Таблица совместимости разных типов блокировок
- S — разделяемая блокировка (чтения);
- U — блокировка обновления (установленная в запросе конструкцией «ДЛЯ ИЗМЕНЕНИЯ»);
- X — исключительная (эксклюзивная) блокировка (на запись).
Объем информации в информационных системах постоянно растет, что влечет увеличение времени доступа к данным. Для соблюдения достоверности получаемой информации существует механизм блокировки данных. Раньше управлять блокировками 1С было практически невозможно, но в 1С 8.1 эту ситуацию исправили – появился механизм управляемых блокировок. При этом также осталась возможность отдать управление на усмотрение СУБД (автоматический режим). При использовании данного режима достигается высокая параллельность использования определенных данных и сокращается время ожидания. Разработчик может выбрать один из следующих типов:
Разделяемая блокировка 1С устанавливается для того, чтобы данные не были изменены другими транзакциями. Исключительная блокировка, помимо этого, обеспечивает запрет не только изменения этих данных, но даже их чтения другими транзакциями, устанавливающими управляемые блокировки. Можно сказать, что исключительная управляемая блокировка является средством борьбы с конфликтами блокировок (deadlock) и может использоваться аналогично ключевому слову для изменения языка запросов (используется в режиме автоматических блокировок).
Исключительная блокировка в 1С используется в том случае, когда нам необходимо сделать изменение данных, зная их предыдущее состояние, т.е. в течение времени транзакции недопустимо изменение необходимых нам данных.
2. Проведение приходных и расходных накладных
Исключительная блокировка 1С в отличии от разделяемой носит большую временную нагрузку для системы, ведь при разделяемой одни и те же файлы данных 1С можно записать одномоментно. Например, при одновременном проведении приходных накладных нам не важен контроль остатков, т.к. движения итак плюсовые.
Но при проведении расходной накладной нам не обойтись без исключительной блокировки 1С для соблюдения достоверности данных. В момент проведения данные по остаткам не должны быть доступны другим транзакциям.
3. Установка блокировки в коде
В коде установка блокировки выглядит следующим образом:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить();
ЭлементБлокировки.Область = "РегистрНакопления.ОстаткиНоменклатуры";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Номенклатура", Справочники.Номенклатура.НайтиПоНаименованию("Яблоко")); //поиск по наименованию в целях примера
ЭлементБлокировки.УстановитьЗначение("Свойство", Справочники.Свойства.НайтиПоНаименованию("Красное")); //поиск по наименованию в целях примера
Блокировка.Заблокировать();
При установке блокировки важно понимать, какой минимум блокируемых данных нам необходим, ведь в случае блокировки избыточного количества данных мы увеличиваем вероятность ожидания этих данных другими транзакциями данных.
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Если мы хотим, чтобы многопользовательская система работала быстро – нужно, среди прочего, подумать, как минимизировать ожидания на блокировках. Как только появляются ожидания – замедляется проведение документов.
Поэтому важно проектировать поведение системы на самых ранних этапах – до написания программного кода.
И здесь есть важный нюанс:
программисты часто думают, что управляемые блокировки происходят на уровне записей.
Мы подготовили для Вас видео, в котором рассказали, по каким принципам блокируются строки во время работы пользователей и как свести к минимуму количество ожиданий из-за блокировок.
Как это часто бывает, некоторые из этих нюансов в документации не описаны…
Длительность видео 9 минут – и оно того стоит.
Это же всегда неловкий момент, когда ты веришь, что что-то должно работать одним образом, а потом оказывается, что все совсем иначе :)
Тайминг ключевых моментов:
00:41 – постановка задачи
01:52 – демонстрация ожидания при управляемых блокировках
03:09 – первый принцип работы управляемых блокировок
04:40 – второй принцип работы управляемых блокировок
06:46 – третий принцип работы управляемых блокировок
07:37 – анализ причин ожидания на блокировках в решаемой задаче
08:47 – решение проблемы
Умение находить и устранять причины медленной и нестабильной работы систем на 1С обязательно для программистов 1С
Чтобы Вы могли быстро и без ошибок решать эти задачи, мы выпустили новый курс «Ускорение и оптимизация 1С, 2022».
После курса Вы сможете:
- Оценивать состояние системы в любой момент времени
- Быстро находить причины замедления в программном коде – и сразу писать его так, чтобы замедления в будущем не было
- Отслеживать динамику производительности за определенный период
- Устранять ожидания на блокировках и решать проблемы со взаимоблокировками
Для кого этот курс
- Писать код, за который не стыдно – в нестабильное время особенно важно быть в компании на хорошем счету
- Быть востребованным специалистом – на каждом втором собеседовании спрашивают про умение оптимизировать 1С
- Не терять клиентов из-за того, что «ваша 1С тормозит, а вы ничего не делаете» – это и раньше было нехорошо, а теперь и вовсе непозволительная роскошь
Комментарии / обсуждение (31):
Блин. Все таблицы плоские, Нет там областей, есть записи. 10 лет писал а FoxPro и ни каких проблем не возникало с блокировками записей. Откуда этот гимор.
Речь идет не о таблицах и блокировках СУБД, в видео говорится про управляемые блокировки которые “живут” на сервере 1С, они блокируют не таблицы СУБД, а пространства 1С.
Спасибо за ценную информацию!
Пожалуйста!
Интересного обучения!
Андрей, добрый день! Спасибо за разъяснение.
Подскажите, если блокировка набора записи (подчинен регистратору) происходит по регистратору. Значит при проведении двух документов регистраторов возникнут блокировки на наборах, у которых совпадают значения хотя бы одного из измерений, правильно?
Здравствуйте.
1. То что регистр подчинен регистратору здесь роли не играет, т.к. регистраторы разные то и ожидания на пространстве ИмяРегистра.НаборЗаписей практически никогда не бывает.
2. Что бы было ожидание на обычном пространстве блокировок, у вас должна быть хотя бы одна одинаковая комбинация значений измерений в обоих документах.
Если значение хотя бы в одном измерении отличается то это уже другая область.
Попробуйте от руки начертить координатную сетку как на видео, и в уме провести 2 документа параллельно закрашиваю квадраты, думаю все сразу встанет на свои места.
Вообще ситуация из видео когда не указано значение поля блокировки не возможна при записи движений при проведении, т.к. в этот момент платформа сама ставит упр. блокировку по всем измерениям регистра.
Читайте также: