Автоматический режим блокировки недопустим в транзакции. Механизм управляемых блокировок

Механизм транзакционных блокировок используется для конкурентного доступа пользователей к СУБД.
Транзакция - эта некая неразрывная операция, в ходе которой меняется состояние базы. Это минимальный квант изменений: нельзя сделать пол-транзакции; если транзакция не завершилась, то база откатится в начальное состояние.
Поскольку транзакция захватывает массив данных, возникает нюанс по доступу к этому массиву: например, одна транзакция меняет данные, а другая пробует их прочитать. Результат чтения может быть некорректным, т.к. не включит последних изменений. Поэтому, на уровне СУБД работает изоляция транзакций. Возможны следующие уровни изоляции:

  • Read uncommited - пока одна транзакция меняет массив, другая не может его менять, но может читать. Низший уровень изоляции.
  • Read commited - пока одна транзакция меняет массив, другая не может его ни менять, ни читать
  • Repeatable read - пока одна транзакция читает массив, другая не может его менять, но может прочесть
  • Serialaizable - пока одна транзакция читает массив, другая не может его ни менять, ни читать. Все операции последовательны. Максимальный уровень изоляции.

Если для конфигурации 1С:Предприятия установлен режим автоматических блокировок , то уровень изоляции транзакции выбирается СУБД. В случае с MS SQL, это будет Repeatable read или Serializable уровни, то есть изоляция данных близка к максимальной. Это решает проблемы с корректностью данных, но может приводить к появлению блокировок на уровне СУБД при интенсивной работе пользователей. Поэтому, в 1С:Предприятии есть свой функционал работы с блокировками, который активизируется включением режима управляемых блокировок. В этом случае уровень изоляции транзакций для MS SQL будет Read commited. Платформа сама будет изолировать данные, не полагаясь на СУБД.

Включение режима управляемых блокировок происходит в свойствах конфигурации:

Также, режим блокировок может быть установлен для конкретных объектов конфигурации:

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

Для режима Автоматический и управляемый есть один момент. Транзакция, единая для пользователя может представлять собой несколько транзакций с точки зрения платформы. Например, интерактивное проведение документа по регистру делает две транзакции - запись самого документа, и внутри этой транзакции запись набора строк по регистру. В зависимости от режима управления блокировками для самого документа и двигаемого им регистра, возможны четыре ситуации:

  1. Режим документа Автоматический, режим регистра Автоматический ->
  2. Режим документа Управляемый, режим регистра Управляемый-> запись по регистру в управляемом режиме
  3. Режим документа Автоматический, режим регистра Управляемый -> запись по регистру в автоматическом режиме
  4. Режим документа Управляемый, режим регистра Автоматический -> исключительная ситуация (ошибка)

Вопрос 06.59 экзамена 1С:Профессионал по платформе. При проведении документа по какому-либо регистру в случае если у документа установлен автоматический режим управления транзакционными блокировками, а у регистра управляемый (в свойствах конфигурации используется вариант "Автоматический и управляемый"), то такое проведение приведет:

Правильный ответ второй, определяем по первой транзакции, если автоматическая, то все автоматически.

Вопрос 06.60 экзамена 1С:Профессионал по платформе. При проведении документа по какому-либо регистру в случае если у документа установлен управляемый режим управления транзакционными блокировками, а у регистра автоматический (в свойствах конфигурации используется вариант "Автоматический и управляемый"), то такое проведение приведет:

  1. к возникновению ошибочной ситуации
  2. вся транзакция будет выполнена в автоматическом режиме
  3. вся транзакция будет выполнена в управляемом режиме

Правильный ответ первый, определяем по первой транзакции, если управляемая, то ошибка.

Вопрос 06.61 экзамена 1С:Профессионал по платформе. При проведении документа по какому-либо регистру в случае если у документа установлен автоматический режим управления транзакционными блокировками, а у регистра управляемый (в свойствах конфигурации используется вариант "Управляемый"), то такое проведение приведет:

  1. к возникновению ошибочной ситуации
  2. вся транзакция будет выполнена в автоматическом режиме
  3. вся транзакция будет выполнена в управляемом режиме

Система “1С:Предприятие” позволяет использовать два режима работы с базой данных: режим автоматических блокировок в транзакции и режим управляемых блокировок в транзакции.

Принципиальное отличие этих режимов заключается в следующем. Режим автоматических блокировок не требует от разработчика каких-либо действий по управлению блокировками в транзакции для того. Эти правила обеспечиваются платформой системы “1С:Предприятие” за счет использования определенных уровней изоляции транзакций в той или иной СУБД. Такой режим работы является наиболее простым для разработчика, однако в некоторых случаях (например, при интенсивной одновременной работе большого количества пользователей) используемый уровень изоляции транзакций в СУБД не может обеспечить достаточной параллельности работы, что проявляется в виде большого количества конфликтов блокировок при работе пользователей.

При работе в режиме управляемых блокировок система “1С:Предприятие” использует гораздо более низкий уровень изоляции транзакций в СУБД, что позволяет значительно повысить параллельность работы пользователей прикладного решения. Однако, в отличие от режима автоматических блокировок, данный уровень изоляции транзакций уже не может сам по себе обеспечить выполнение всех правил работы с данными в транзакции. Поэтому при работе в управляемом режиме от разработчика требуется самостоятельно управлять блокировками, устанавливаемыми в транзакции.

В сводном виде отличия при работе в режиме автоматических блокировок и в режиме управляемых блокировок приведены в следующей таблице:

Установка режима блокировок в конфигурации

Конфигурация имеет свойство Режим управления блокировкой данных. Каждый прикладной объект конфигурации также имеет свойство Режим управления блокировкой данных.
Режим управления блокировкой данных для всей конфигурации в целом может быть установлен в значения Автоматический, Управляемый (установлено по умолчанию для новой конфигурации) и Автоматический и управляемый. Значения Автоматический и Управляемый означают, что соответствующий режим блокировки будет использоваться для всех объектов конфигурации, независимо от значений, установленных для каждого из объектов. Значение Автоматический и управляемый означает, что для конкретного объекта конфигурации будет использован тот режим, который указан в его свойстве Режим управления блокировкой данных: Автоматический или Управляемый.
Следует отметить, что режим управления блокировкой данных, указанный для объекта метаданных, устанавливается для тех транзакций, которые инициируются системой «1С:Предприятие» при работе с данными этого объекта (например, при модификации данных объекта).
Если же, например, операция записи объекта выполняется в транзакции, инициированной разработчиком (метод НачатьТранзакцию()), то режим управления блокировкой данных будет определяться значением параметра Режим блокировок
метода НачатьТранзакцию(), а не значением свойства объекта метаданных Режим управления блокировкой данных.
По умолчанию параметр Режим блокировок имеет значение РежимУправленияБлокировкойДанных.Автоматический, поэтому для
того, чтобы в явной транзакции использовать режим управляемых блокировок, следует указывать значение этого параметра
РежимУправленияБлокировкойДанных.Управляемый.

Работа с управляемыми блокировками средствами встроенного языка

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

Условия задаются на равенство значения поля указанному значению или на вхождение значения поля в указанный диапазон.
Условия могут быть заданы двумя способами:

  • с помощью явного указания имени поля и значения (метод УстановитьЗначение() объекта ЭлементБлокировкиДанных);
  • с помощью указания источника данных, содержащего необходимые значения (свойство ИсточникДанных объекта ЭлементБлокировкиДанных).

Для каждого элемента блокировки может быть задан один из двух режимов блокировки:

  • разделяемый,
  • исключительный.

Таблица совместимости управляемых блокировок выглядит следующим образом

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

Особенности работы в режиме «Автоматический и управляемый»

При работе в режиме управления блокировками Автоматический и управляемый следует учитывать две особенности:

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

Рассмотрим перечисленные особенности более подробно.

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

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

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

Основные причины перехода на управляемые блокировки:

  • Основная причина - рекомендация 1С:Эксперта на основании показаний или 1С:ЦУП
  • Проблемы с параллельной работой пользователей ()
  • Использование Oracle, PostgreSQL и .

Стоимость работ:

Суть управляемых блокировок

При работе в автоматическом режиме управления блокировкой 1С:Предприятие устанавливает высокую степень изоляции данных в транзакции на уровне СУБД. Это позволяет полностью исключить возможность получения не целостных или некорректных данных без каких-либо специальных усилий со стороны прикладных разработчиков.

Это удобный и правильный подход при небольшом количестве активных пользователей. Цена простоты разработки - некоторое количество избыточных блокировки на уровне СУБД. Эти блокировки связанны как с особенностями реализации механизмов блокировок в самой СУБД, так и с тем, что СУБД не может учитывать (и не учитывает) физический смысл и структуру объектов метаданных 1С:Предприятия.

При работе с высокой конкуренцией за ресурсы (большое количество пользователей) в какой-то момент влияние избыточности блокировок становиться заметным с точки зрения производительности при параллельном режиме.

После перевода конфигурации в управляемый режим в платформе активизуруется дополнительный функционал «менеджера блокировок» и контроль за целостностью данных осуществляется теперь не на стороне СУБД, а на стороне сервера 1С. Это увеличивает нагрузку на железо сервера 1С (нужны быстрее процессоры и больше памяти), и фактически вносит даже небольшое замедление (несколько процентов), однако куда существенней улучшает ситуацию с блокировками (меньше блокировок за счет блокировок на объект, а не на комбинацию таблиц, меньше область блокирования и в некоторых случаях меньше время жизни блокировок на чтение, т.е. не до конца транзакции). За счет этого общая параллельность улучшается.


Новые конфигурации фирмы 1С реализованы сразу в управляемом режиме.

  • Вопрос: Можно ли сначала сделать аудит, а потом перевод на УБ?

Ответ: Можно , аудит послужит дополнительным обоснованием целесообразности перевода на управляемые блокировки а также оценить вклад автоматических блокировок в общее замедление и нужны ли дополнительные усилия кроме перевода.

  • Вопрос: Для перевода на УБ, какой именно нужно предоставить доступ — RDP, TeamViewer ? Или можно вам выслать файл-конфигурации?

Ответ: Мы стараемся не ограничивать одной конкретной технологией удаленного доступа, годится любая технология удаленного доступа . Если для Вас не имеет значения, то практичней RDP.
Мы можем выполнить оптимизацию по высланному файлу конфигурации, но тогда не сможем отладить некоторые реальные данные и Вам придется внимательней тестировать. Если мы выполняем оптимизацию на копии базы, то мы можем тщательней протестировать, прежде чем передадим Вам результат работы.

  • Вопрос: У нас 10-ть штатных программистов, которые каждый день что-то изменяют в конфе. Используется общее хранилище конфигурации». Как будет организовано взаимодействие при переводе на УБ? Или всех программистов нужно отправлять в отпуск?

Ответ: Как правило наши изменения делаются в течении пары дней. Остальное время приходится на тестирование внесенных изменений, в том числе с точки зрения требуемой логики определяемой бизнесом а не техническими соображениями. Мы можем внести изменения в отдельный файл конфигурации cf , а затем Ваш программист внесет в хранилище. В отпуск ни кого отправлять не придется . В других вариантах взаимодействия надо просто договорится какие объекты планируют захватить Ваши разработчики, чтобы мы выстроили план работ, удобный обеим сторонам. Как правило целиком конфигурацию захватить Вашим разработчикам не требуется, либо отдадите на день нам «руль».

Механизм управления блокировками данных в транзакции позволяет осуществлять блокировку изменяемых данных не средствами используемой системы управления базами данных, а средствами платформы. Такое управление блокировками данных выполняется не в терминах данных СУБД, а в терминах предметной области. Благодаря этому блокировки накладываются "точнее" и параллельность работы пользователей повышается.

Конфигурация 1С:Предприятия 8 может работать в одном из трех режимов управления блокировками в транзакции:

  • автоматический;
  • управляемый - стандартный режим для новых конфигураций;
  • автоматический и управляемый.

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

Управляемый режим позволяет повысить параллельность работы пользователей в клиент-серверном варианте работы за счет использования более низкого уровня изоляции транзакций базы данных (Read Committed). При записи данных в транзакции объекты встроенного языка автоматически блокируют необходимые данные. Разработчику требуется управлять блокировками данных в тех случаях, когда бизнес-логика требует согласованного и целостного чтения данных в транзакции.

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

В сводном виде отличия при работе в режиме автоматических блокировок и в режиме управляемых блокировок приведены в следующей таблице:

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

Специально для этого у наборов записей регистров накопления и регистров бухгалтерии существует свойство БлокироватьДляИзменения .

Если нужно контролировать остатки, а затем записывать движения в этот же регистр, то это свойство нужно установить для набора записей этого регистра в свойстве Движения .

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

Ниже приведен пример "ручного" управления блокировками данных при чтении данных регистра накопления УчетНоменклатуры в обработке проведения документа РасходнаяНакладная . В этом примере управляемые блокировки создаются и устанавливаются полностью только средствами встроенного языка.