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

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.3 Бесплатно (free)

Шпаргалка по настройке технологического журнала.

27.04.2024    1807    kuzyara    2    

61

Магия преобразований Vector, часть 2: технологический журнал

Технологический журнал Мониторинг Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

15.11.2023    878    4    AlexSTAL    0    

8

Магия преобразований: ЖР, ТЖ, RAS/RAC, логи - универсальное решение Vector

Мониторинг Журнал регистрации Технологический журнал Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

13.11.2023    3287    5    AlexSTAL    0    

44

«Монитор» – простой анализ производительности

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

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

21.09.2023    6004    Andreynikus    14    

80

Экспорт технологического журнала 1С в Elastic с помощью Logstash

Технологический журнал Платформа 1С v8.3 Абонемент ($m)

Целью данного решения является организация хранения и анализа данных из технологического журнала 1С с использованием стека Elasticsearch + Logstash + Kibana.

5 стартмани

18.09.2023    3593    huxuxuya    3    

23

Мобильный помощник эксперта 1С (приложение android, позволяющее строить отчеты на СКД по логам технологического журнала и не только)

Технологический журнал Мониторинг Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

16.05.2023    3533    capitan    0    

24

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

Технологический журнал Абонемент ($m)

Технологический журнал - мощный инструмент логирования, используемый для анализа проблем производительности 1С. Но он обладает одним огромным недостатком, в "сыром виде" он почти не поддается адекватному анализу из-за своей структуры. Существует довольно много способов "разобрать" технологический журнал, но все опробованные способы обладают теми или иными недостатками. Предлагаю вам мой вариант "велосипеда" для разбора ТЖ и хранения разобранного в различных форматах.

1 стартмани

12.12.2022    8494    39    Segate    26    

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