Разбор причины ошибки "Нарушение целостности чтения объекта базы данных из-за параллельного изменения объекта другим сеансом"

25.06.21

База данных - Технологический журнал

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

О стенде и инструментах

Тестовый стенд: режим управления блокировками управляемый, версия платформы 8.3.12.

Для расследования проблемы использовался технологический журнал (далее по тексту ТЖ).
Более подробно о нем написано написано в публикациях Рецепты приготовления технологического журнала и Описание почти всех событий технологического журнала.

 

Описание ошибки в ЖР

Расследуемая ошибка в журнале регистрации выглядит так:

 

Случай 1 (объектное чтение ПолучитьОбъект())

Воспроизведение

Для воспроизведения проблемы создадим множество потоков на запись следующим кодом

Процедура ЗапуститьФоновыеЗадания(Кнопка)
	
	// Обработка сделана для расследования ошибки:
	// Нарушение целостности чтения объекта базы данных из-за параллельного изменения объекта другим сеансом
	
	МассивПараметров = Новый Массив;
	МассивПараметров.Добавить(Документ);
	МассивПараметров.Добавить(1);
	
	Для Инд = 1 по 100 Цикл
		
		ФоновыеЗадания.Выполнить("Привилегированный.Записать", МассивПараметров, "КлючЗаписать " + Инд);
		ФоновыеЗадания.Выполнить("Привилегированный.Записать", МассивПараметров, "КлючЗаписатьДублирующий " + Инд);
		
	КонецЦикла;
	
КонецПроцедуры

Процедура Записать(Документ, Значение) Экспорт
	
	ДокументОбъект = Документ.ПолучитьОбъект();
	ДокументОбъект.Реквизит = Значение;
	ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
	
КонецПроцедуры

Расследование

Посмотрим на события в ТЖ:

 

Видим последовательность действий по документу ID=282:ae5600505699b66311e9899bd8fdecc8

  1. Наложения неявной блокировки платформой при записи (07:16.164118 TLOCK)
  2. Обновление в СУБД данных документа (07:19.321016 SDBL ... 'UPDATE ...')
  3. Фиксация транзакции вместе с этими изменениями (07:20 SDBL)
  4. Объектное чтение во время фиксации данных объекта (07:20.430016 SDBL, обращаем внимание на чтение версии по документу ID=282:ae5600505699b66311e9899bd8fdecc8)
  5. Ошибку чтения из-за параллельного изменения (07:20.430017 EXCP)

Исправление ошибки

Избежать ошибки можно организовав очередь к документу наложив явную управляемую блокировку перед записью документа

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

В ТЖ будет видно 2 исхода события

1. Успешное наложение блокировки и ожидание 2 потоком пока 1 отработает

2. Неудачная попытка блокировки и откат транзакции

 

Случай 2 (объектное чтение Ссылка.Товары.НайтиСтроки())

Воспроизведение

Рассмотрим аналогичный случай при чтении табличной части документа


Процедура ЗапуститьФоновыеЗадания(Кнопка)
	
	// Обработка сделана для расследования ошибки:
	// Нарушение целостности чтения объекта базы данных из-за параллельного изменения объекта другим сеансом
	
	Склад = Справочники.Склады.НайтиПоКоду("КодСклада");
	
	МассивПараметровЗаписи = Новый Массив;
	МассивПараметровЗаписи.Добавить(Документ);
	МассивПараметровЗаписи.Добавить(1);
	
	МассивПараметровЧтения = Новый Массив;
	МассивПараметровЧтения.Добавить(Документ);
	МассивПараметровЧтения.Добавить(Склад);
	
	Для Инд = 1 по 100 Цикл
		
		ФоновыеЗадания.Выполнить("Привилегированный.Записать", МассивПараметровЗаписи, "КлючЗаписать " + Инд);
		ФоновыеЗадания.Выполнить("Привилегированный.Прочитать", МассивПараметровЧтения, "КлючПрочитать " + Инд);
		
	КонецЦикла;
	
КонецПроцедуры

Процедура Записать(Ссылка, Значение) Экспорт
	
	ДокументОбъект = Ссылка.ПолучитьОбъект();
	ДокументОбъект.Значение= Значение;
	ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
	
КонецПроцедуры

Процедура Прочитать(Ссылка, Склад) Экспорт
	
	Ссылка.Товары.НайтиСтроки(Новый Структура("Склад", Склад));
	
КонецПроцедуры

Расследование

Посмотрим на события в ТЖ:

Видим последовательность по документу ID=282:ae5600505699b66311e9899bd8fdecc8

  1. Наложения неявной блокировки платформой при записи (04:57.680428 TLOCK)
  2. Обновление в СУБД данных документа (04:57/996003 SDBL ... 'UPDATE ...')
  3. Фиксация транзакции вместе с этими изменениями (05:02 SDBL)
  4. Объектное чтение во время фиксации данных объекта (05:02.528150 SDBL, обращаем внимание на чтение версии по документу ID=282:ae5600505699b66311e9899bd8fdecc8)
  5. Ошибку чтения из-за параллельного изменения (05:02.528151)

 

Исправление ошибки

Избежать ошибки можно наложив явную управляемую блокировку перед записью документа или заменив объектное чтение чтением через запросы.

В ТЖ видно чтение через запросы и отсутствие ошибок

Заключение:

Ошибка связана с объектным чтением в момент принятия изменений платформой.
В зависимости от причины ошибки возможны два пути решения:

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

 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Технологический журнал Мониторинг Системный администратор Программист Бесплатно (free)

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

29.12.2025    5395    leongl    0    

18

Администрирование СУБД Технологический журнал Мониторинг Системный администратор Программист Бесплатно (free)

Рассказываем, почему высоконагруженным бэкендам на 1С нужен регулярный мониторинг и что происходит, когда его нет: производительность и стабильность деградируют, а обращения пользователей копятся. Показываем, как построили легкую систему наблюдаемости для бэкендов корпоративных порталов. Она включает сбор метрик из технологического журнала, Apdex, журнала регистрации и динамики размеров таблиц с последующим анализом в связке ClickHouse и служебной информационной базы на 1С. Объясняем, какие отчеты и метрики быстрее всего помогают находить критичные проблемы производительности, и демонстрируем интерфейс расследования. Разбираем несколько кейсов оптимизации, найденных по итогам мониторинга, включая доработки функционала БСП «управление доступом» и «присоединенные файлы».

15.12.2025    3288    tystik    1    

8

Технологический журнал Системный администратор Программист 1С:Предприятие 8 Абонемент ($m)

Убираем лишние переносы строк в событии технологического журнала с помощью SIMD.

1 стартмани

24.11.2025    762    0    sdf1979    2    

2

Мониторинг Журнал регистрации Технологический журнал Системный администратор Программист Бесплатно (free)

Мониторинг в ландшафте 1С помогает не только вовремя выявлять проблемы и повышать SLA, но и укреплять информационную безопасность. Разбираем источники данных, ограничения штатных инструментов и современные практики мониторинга на базе Prometheus, ClickHouse и Grafana. А также рассказываем о коробочном решении «Оркестратор 1С-систем» и планах его развития.

29.10.2025    1815    Sibars    0    

5

Технологический журнал Программист Россия Бесплатно (free)

Logcfg editor — это удобное веб-приложение, предназначенное для создания конфигурационного файла logcfg.xml для системы логирования в 1С:Предприятие. Приложение позволяет настраивать параметры логирования через интуитивно понятный интерфейс, избавляя от необходимости вручную редактировать XML-файлы.

25.08.2025    2685    Metrika42    3    

13

Технологический журнал Системный администратор Программист 1С:Предприятие 8 Абонемент ($m)

Утилита для конвертирования Технологического журнала из текстового формата в JSON.

1 стартмани

28.07.2025    2976    1    SerVer1C    2    

8

Технологический журнал Системный администратор Программист Бесплатно (free)

Чтобы организовать детальный произвольный анализ огромного количества логов технологического журнала, нужен удобный инструмент. Расскажем о том, как с помощью бесплатного решения OpenSearch настроить оповещения в Telegram и на почту об изменениях настроек на сервере 1С, а также дашборды, позволяющие мгновенно находить проблемные объекты и источники блокировок.

24.07.2025    7853    aidar_safin    2    

25

HighLoad оптимизация Рефакторинг и качество кода Технологический журнал Программист 1С:Предприятие 8 Россия Бесплатно (free)

Технологии бегут вперёд, но боль производительности 1С остаётся вечной: инфраструктура, код или настройки? Пока ИИ не научился чинить всё «на лету», мы автоматизировали ключевое — диагностику. Читайте статью — показываем, как превратить хаос диагностики в понятные графики и цифры. Спойлер: это работает даже если ваша 1С — «чёрный ящик» на старом железе.

19.03.2025    6939    Metrika42    9    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. alexeyo51 02.11.22 12:01 Сейчас в теме
Встретился случай, когда такая ошибка возникает без записи объекта в другом сеансе, а при последовательной записи в рамках одного сеанса.
Более того ошибка - при записи набора записей с уникальным отбором (движение для нового документа).
2. pashamak 367 02.11.22 12:22 Сейчас в теме
(1) Интересно посмотреть на пример. Может срабатывает отложенное проведение в ФЗ которое остается без внимания.
Для отправки сообщения требуется регистрация/авторизация