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

Публикация № 1461438 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. переделать объектное чтение на чтение через запросы (повторение ошибки исключено)

 

Специальные предложения

Оставьте свое сообщение

См. также

Исследование технологического журнала 1С при помощи регулярных выражений в блокноте Промо

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

Все из тех, кто пробовали сдать на сертификат "Эксперт по технологическим вопросам 1С", сталкивались с методикой ЦКТП - разбор файлов технологического журнала при помощи консоли bash. Я, в свою очередь,внёс изменения в данную методику. Мне хотелось достичь более понятного вида и сфокусироваться на Perl, в качестве предпочтительного средства обработки файлов ТЖ. Вот что из этого вышло:

30.10.2017    32840    MrWonder    42    

Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности

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

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

07.09.2021    4078    ivanov660    23    

Снова про анализ технологического журнала с помощью PowerShell

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

Универсальная методика анализа технологического журнала (далее - ТЖ) с помощью Powershell без применения алгоритмов программирования.

05.08.2021    1563    cdiamond    1    

Описание почти всех событий технологического журнала

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

Краткое описание событий технологического журнала с примерами. Все для быстрого старта.

19.08.2020    30193    YPermitin    38    

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

Технологический журнал v8 1cv8.cf Бесплатно (free)

Корректируем классификацию ошибок ТЖ в процессе работы для конфигурации мониторинг производительности

17.08.2020    939    ivanov660    0    

Автоматическая классификация ошибок технологического журнала

Технологический журнал v8 1cv8.cf Бесплатно (free)

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

25.06.2020    4519    ivanov660    13    

Выявляем и оптимизируем ресурсоемкие запросы 1С:Предприятия

HighLoad оптимизация Администрирование СУБД Технологический журнал Структура метаданных v8::Запросы Бесплатно (free)

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

24.05.2020    11518    DataReducer    22    

Многострочный контекст событий

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

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

31.03.2020    3899    vasilev2015    11    

Анализ взаимоблокировок

HighLoad оптимизация Технологический журнал v8 v8::blocking Бесплатно (free)

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

20.03.2020    7171    vasilev2015    34    

5 простых шагов и 15 минут на разворачивание инструмента мониторинга проблем производительности базы 1С

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

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

18.04.2019    36673    ivanov660    83    

bash, еще bash, еще много-много bash

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

Делюсь своим опытом параллельного разбора технологического журнала. По мотивам статьи https://infostart.ru/public/928184.

29.10.2018    4833    mickey.1cx    1    

Простые регулярные выражения

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

Шпаргалка к экзамену "Эксперт по технологическим вопросам".

30.04.2018    20730    vasilev2015    39    

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

Инструменты администратора БД Технологический журнал v8 v8::blocking 1cv8.cf Бесплатно (free)

Что делать, если какой-то сеанс наложил блокировку и мешает всем работать? Как выяснить, какой сеанс необходимо убить, чтобы проблема ушла? Такая проблема для администраторов достаточно распространенная, но по непонятным для меня причинам в интернете я не смог найти типового решения данной проблемы. А оно есть!

22.09.2015    33974    mpeg1989    35    

Технологический журнал 1С v8.1 для ленивых

Технологический журнал v8 1cv8.cf Россия Бесплатно (free)

Статья о ключах защиты http://infostart.ru/blogs/745/ показала, что 1-2 страницы все-таки прочитать можно. Здесь будет сделана попытка расказать о технологическом журнале.

23.01.2009    126856    Gilev.Vyacheslav    129