Книга: Настольная книга 1С:Эксперта по технологическим вопросам
Назад: Пояснение к правилу 13 (в проблемных запросах отказываться от ИЛИ)
Дальше: Пояснение к правилу 15 (не получать значение через точку от поля составного типа)

Пояснение к правилу 14 (избегать запросов к пустым таблицам в режиме автоматического управления блокировками «1С»)

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

Проведем эксперимент. Создадим в базе новые объекты:

В конфигурации установим автоматический режим управления блокировками.

Код обработки проведения показан на рис. 4.20.5, данные из табличной части 1 формируют движения по регистру накопления 1, данные из табличной части 2 формируют движения по регистру накопления 2.

Рис. 4.20.5. Модуль документа «Документ1»

Дальше создадим и проведем пару десятков документов, заполняя в них только табличную часть 1.

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

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

Это не удастся сделать, результатом станет конфликт блокировок СУБД. Разобрав ожидания на блокировках ЦУП, увидим, что конфликт произошел на регистре накопления 2, то есть на пустой таблице, в которую идет запрос на запись «пустых» движений.

Чтобы избавиться от конфликта блокировок, надо сделать одно из двух следующих действий:

  1. В конфигурации установить управляемый режим управления блокировками.
  2. Не записывать движения по регистру накопления 2 (см. рис. 4.20.6).

Рис. 4.20.6. Один из вариантов избавления от конфликта блокировок – закомментировать запись заведомо пустых движений в заведомо пустую таблицу регистра

Назад: Пояснение к правилу 13 (в проблемных запросах отказываться от ИЛИ)
Дальше: Пояснение к правилу 15 (не получать значение через точку от поля составного типа)