Где хранятся блокировки объектов и данных в 1С:Предприятии 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При оптимизации высоконагруженных информационных систем и расследовании конфликтов параллельного доступа разработчики часто задаются вопросом: где физически располагается информация о блокировках? Нередко возникает путаница между объектными блокировками редактирования, управляемыми транзакционными блокировками платформы и физическими блокировками таблиц на стороне СУБД. Разберем детально архитектуру подсистемы блокировок платформы 1С:Предприятие 8.3, выясним места их хранения и рассмотрим практические методы их мониторинга.

Классификация блокировок в платформе 1С

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

  1. Пессимистические (объектные) блокировки — предназначены для предотвращения одновременного интерактивного редактирования одного и того же объекта несколькими пользователями в пользовательском интерфейсе.
  2. Управляемые транзакционные блокировки — логический механизм платформы 1С, обеспечивающий изоляцию транзакций по заданным пространствам имен и диапазонам значений без жесткого блокирования всей СУБД.
  3. Блокировки СУБД (автоматические транзакционные блокировки) — физические структуры данных внутри сервера баз данных (MS SQL Server, PostgreSQL, IBM DB2, Oracle Database), удерживающие страницы, строки или целые таблицы.

Где физически хранятся пессимистические (объектные) блокировки

Рассмотрим механизм объектных блокировок. Когда пользователь открывает форму документа или элемента справочника на редактирование либо в программном коде вызывается метод ЗаблокироватьДанныеДляРедактирования(), платформа регистрирует объектную блокировку.

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

Выделим ключевые особенности их хранения:

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

Посмотрим на пример перехвата объектной блокировки в коде, когда требуется программно определить занятость объекта:


Попытка
    ЗаблокироватьДанныеДляРедактирования(СсылкаНаДокумент);
Исключение
    Информация = ОписаниеОшибки();
    // Платформа вернет подробное описание с именем пользователя, заблокировавшего объект
    ВызватьИсключение "Объект заблокирован пользователем: " + Информация;
КонецПопытки;

Где хранятся управляемые транзакционные блокировки

Проанализируем второй вид блокировок — управляемые транзакционные блокировки. Они создаются либо неявно (при записи объектов и наборов записей конфигурации, для которых установлен режим Управляемый), либо явно с помощью программного объекта БлокировкаДанных внутри открытой транзакции.

Место их расположения — оперативная память сервиса транзакционных блокировок кластера 1С (процесс rmngr). Сервер СУБД ничего не знает о логических пространствах управляемых блокировок 1С. Менеджер кластера ведет в ОЗУ собственные таблицы соответствий пространств имен, полей и диапазонов значений.

Разберем пример явной установки управляемой блокировки с использованием объекта БлокировкаДанных:


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

НачатьТранзакцию();
Попытка
    Блокировка.Заблокировать();
    // Выполнение движений и проверок
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;
КонецПопытки;

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

Блокировки на уровне СУБД

Выясним, какую роль играет сам сервер баз данных. Если в свойствах конфигурации выбран Автоматический режим управления блокировкой данных, система 1С полностью перекладывает контроль параллелизма на СУБД. В этом режиме при начале транзакции выставляются высокие уровни изоляции (Serializable/Repeatable Read).

В таком сценарии блокировки формируются и хранятся в оперативной памяти самой СУБД (пул блокировок в MS SQL Server или разделяемая память shared_buffers в PostgreSQL). Сервер 1С не имеет внутреннего реестра этих блокировок: он лишь отправляет SQL-запросы и в случае конфликта получает ошибку превышения времени ожидания от СУБД.

При работе в режиме Управляемый платформа снижает уровень изоляции транзакций на уровне СУБД до Read Committed (в MS SQL Server рекомендуется режим Read Committed Snapshot Isolation — RCSI). Это позволяет читать данные без наложения блокировок на уровне СУБД, а всю конкуренцию за данные берет на себя менеджер транзакционных блокировок 1С.

Диагностика и поиск конфликтов блокировок

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

  1. Анализ технологического журнала (ТЖ) 1С: для расследования управляемых транзакционных блокировок настраивается сбор событий TLOCK, TTIMEOUT и TDEADLOCK. Событие TLOCK позволяет увидеть заблокированные пространства (параметр Regions), значения отборов (Locks) и номер соединения, удерживающего блокировку (WaitConnections). Включение свойств Context и p:processName дает возможность выявить точную строку исходного кода, спровоцировавшую ожидание.
  2. Администрирование кластера 1С: список активных объектных блокировок можно получить программно через утилиту командной строки rac или COM-интерфейс администрирования вызовом метода GetLocks().
  3. Системные представления СУБД: для анализа блокировок на стороне СУБД (например, при эскалации блокировок строк до таблицы) в MS SQL задействуют динамические административные представления sys.dm_tran_locks и sys.dm_os_waiting_tasks, а в PostgreSQL — таблицы pg_locks и pg_stat_activity.

Таким образом, в клиент-серверной архитектуре 1С 8.3 блокировки не сохраняются в служебных файлах сеансов на жестком диске. Они удерживаются исключительно в оперативной памяти: логические (объектные и управляемые) — в процессе rmngr сервера 1С, а физические транзакционные — в памяти используемой СУБД.

← На главную