Таймаут на управляемой блокировке

1. 150 04.08.22 10:59 Сейчас в теме
Помогите разобраться в причине таймаута на управляемых блокировках при параллельной записи в регистр сведений. Во вложении структура регистра, в архиве логи из rphost, в файле "события блокировки.txt" то, что я накопал по таймауту. В найденных мной TLOCK по измерению Fld4069 (ОбъектРемонтныхРабот) пересечений быть не должно, но таймаут есть.

1С клиент-серверная, 8.3.19.1522, развернута на Astra Linux.
Прикрепленные файлы:
22080315.zip
события блокировки.txt
Вознаграждение за ответ
Показать полностью
Найденные решения
21. kholkin 150 05.08.22 15:43 Сейчас в теме
(20)
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.торо_ПериодыПланированияППР");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = ПланРемонтов;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ОбъектРемонтныхРабот", "ОбъектРемонтныхРабот");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ВидРемонтныхРабот", "ВидРемонтныхРабот");


Да, ручная установка блокировки помогла, но только если не указывать все пять измерений регистра, если указать все пять измерений, то конфликт блокировок опять возникает. Во вложении решение, которое у меня получилось. Большое спасибо!
Прикрепленные файлы:
triviumfan; +1 Ответить
20. triviumfan 29 05.08.22 14:36 Сейчас в теме +2 $m
(19)А если явно указать поля блокировки? Добавить к существующим сей код:
	// Периоды планирования ППР
	ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.торо_ПериодыПланированияППР");
	ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
	ЭлементБлокировки.ИсточникДанных = ПланРемонтов;
	ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ОбъектРемонтныхРабот", "ОбъектРемонтныхРабот");
	ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ВидРемонтныхРабот", "ВидРемонтныхРабот");

ЗЫ: По этим полям как раз отдельные индексы есть.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Andreynikus 1211 04.08.22 12:41 Сейчас в теме
Пришлите скрин структуры регистра из конфигуратора, что бы было видно что из этого измерения, что реквизиты и пр.
3. kholkin 150 04.08.22 12:47 Сейчас в теме
(2) вот
Прикрепленные файлы:
4. Andreynikus 1211 04.08.22 13:09 Сейчас в теме
(3) У вас только один процесс rphost?
Если их несколько, то пришлите логи остальных процессов.
5. kholkin 150 04.08.22 13:16 Сейчас в теме
6. Andreynikus 1211 04.08.22 14:48 Сейчас в теме
(5)
Ожидание у вас происходит потому, что нет поля Recorder (регистратор) в качестве поля для блокировки. Оно есть в пространстве InfoRg4066.RECORDER, но его нет в пространстве InfoRg4066.DIMS, хотя при записи оно должно там быть.
Так что нужно разбираться, почему его там нет.
Посмотрите как именно формируются движения по этому регистру. При стандартном формировании поле Recorder для пространства DIMS обязательно появляется.
7. kholkin 150 04.08.22 14:50 Сейчас в теме
(6) спасибо, проверю, по результатам отпишусь
8. kholkin 150 04.08.22 17:11 Сейчас в теме
(6) Сделал простые тестовые документ и регистр сведений с измерениями строкового типа, через конструктор написал движения. В пространстве InfoRg4066.DIMS также нет поля Recorder
Прикрепленные файлы:
9. kholkin 150 04.08.22 17:14 Сейчас в теме
(6) Еще научился вручную воспроизводить конфликт на малом количестве строк в документе. Логи во вложении, может будет проще разобраться так. При этом воспроизвести на моем самописном документе лнт_Тест не получается.
Прикрепленные файлы:
locks мало строк в ТЧ.zip
10. Andreynikus 1211 04.08.22 23:56 Сейчас в теме
(9)
Каюсь, в (6) это я фигню написал, такое только для регистров с периодичностью по позиции регистратора.
Вообще судя по логам все нормально, не должно быть ожидания при штатном поведении платформы.
У вас есть какая-нибудь миникопия базы на которой это воспроизводится? Или может cf со стабильным воспроизведением.
Это бы сильно ускорило процесс.
11. kholkin 150 05.08.22 07:54 Сейчас в теме
(10) Попробую воспроизвести на демо базе по возможности.
12. triviumfan 29 05.08.22 09:02 Сейчас в теме
(11) Может у вас в проде таблица "торо_ПериодыПланированияППР" пухлая? Запросы к ней неоптимальные, отсюда и долгая транзакция.
13. kholkin 150 05.08.22 09:11 Сейчас в теме
Длительность транзакции не должна быть причиной блокировки в данном случае, так как нет пересечений по полям блокировки.
14. Andreynikus 1211 05.08.22 09:22 Сейчас в теме
(13)
Вообще очень похоже на ошибку платформы.
Попробуйте воспроизвести то же самое на сервере на Windows или на др. версиях платформы.
15. Andreynikus 1211 05.08.22 09:27 Сейчас в теме
Еще как вариант поищите похожую ошибку на bugboard.v8.1c.ru
возможно она уже зарегистрирована.
16. triviumfan 29 05.08.22 13:14 Сейчас в теме
Мне кажется, что тут описка, ведь простраства блокировки с именем "ID" для регистра "торо_ПериодыПланированияППР" не существует, соответственно, он весь блокируется, не так (я ещё бегинер в блокировках)? Наверное, там должен быть объект ремонта/вид работ.
Кто-то скопировал код из блокировки РегистрСведений.торо_Ремонты.
Прикрепленные файлы:
17. kholkin 150 05.08.22 14:08 Сейчас в теме
(16) Да, в коде похоже ошибка. Закомментировал сначала блокировку по "торо_ПлановыеРемонтныеРаботы" - не помогло. Потом закомментировал всю процедуру, к сожалению, тоже не помогло, хотя когда я увидел ваш комментарий, то подумал, что решение найдено.
Прикрепленные файлы:
18. triviumfan 29 05.08.22 14:28 Сейчас в теме
(17) Прошу прощения, я запутался, изначально ведь речь была про регистр "торо_ПериодыПланированияППР" (с ним все ок), а не "торо_ПериодыПланированияППР".
А по "торо_ПериодыПланированияППР" вообще нет явных блокировок.
19. kholkin 150 05.08.22 14:30 Сейчас в теме
(18) Точно, и я не обратил внимание на название регистров.
20. triviumfan 29 05.08.22 14:36 Сейчас в теме +2 $m
(19)А если явно указать поля блокировки? Добавить к существующим сей код:
	// Периоды планирования ППР
	ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.торо_ПериодыПланированияППР");
	ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
	ЭлементБлокировки.ИсточникДанных = ПланРемонтов;
	ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ОбъектРемонтныхРабот", "ОбъектРемонтныхРабот");
	ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ВидРемонтныхРабот", "ВидРемонтныхРабот");

ЗЫ: По этим полям как раз отдельные индексы есть.
21. kholkin 150 05.08.22 15:43 Сейчас в теме
(20)
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.торо_ПериодыПланированияППР");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = ПланРемонтов;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ОбъектРемонтныхРабот", "ОбъектРемонтныхРабот");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ВидРемонтныхРабот", "ВидРемонтныхРабот");


Да, ручная установка блокировки помогла, но только если не указывать все пять измерений регистра, если указать все пять измерений, то конфликт блокировок опять возникает. Во вложении решение, которое у меня получилось. Большое спасибо!
Прикрепленные файлы:
triviumfan; +1 Ответить
24. triviumfan 29 05.08.22 15:58 Сейчас в теме
(21) Странно. Спасибо, и я намотал на ус)
Хотя, я бы оставил лишь первые 3 измерения.
25. triviumfan 29 05.08.22 16:05 Сейчас в теме
(21) Дата окончания планирования не входит в индекс, я бы убрал.
26. kholkin 150 05.08.22 16:06 Сейчас в теме
(25) Для управляемых блокировок индекс не важен, насколько я знаю.
27. triviumfan 29 07.08.22 20:30 Сейчас в теме
(26) Сомневаюсь, ведь как тогда эти записи будут блокироваться, для начала их ведь найти нужно, а как их поиск осуществляться будет... по индексу быстрее все-таки.
Я бы у Андрея @Andreynikus спросил, он в этом мастер)
(22) @Andreynikus, не подскажешь? Нужно ли стараться, чтобы поля пространства блокировки входили в индекс?
28. kholkin 150 08.08.22 15:52 Сейчас в теме
(27) Когда накладывается управляемая блокировка, 1С никак не взаимодействует с СУБД. Данные, которые блокируешь, не надо искать, они у тебя уже есть, их ты и передаешь в элемент блокировки (например ссылки на элементы справочников).

Цитата из курса Андрея Бурмистрова:

"За работу менеджера блокировок отвечает процесс сервера приложений под названием rmngr. Процесс rmngr работает не только с блокировками, он выполняет и другие функции, но управляемые блокировки – одна из главных его обязанностей. Менеджер блокировок для работы использует служебную таблицу, которая хранится в оперативной памяти сервера приложений. Как только транзакция запрашивает блокировку, менеджер проверяет, заблокирован ли запрашиваемый ресурс, и если нет, то блокировка ставится. Если ресурс уже кем-то заблокирован, тогда проверяется совместимость запрашиваемой и установленной блокировок. Если режимы совместимы, то блокировка устанавливается, если же несовместимы, транзакция встает в очередь. При этом если менеджер видит, что от одного соединения идет попытка заблокировать один и тот же объект еще раз, то второй раз блокировка не накладывается.
Чем больше в системе блокировок, тем больше размер служебной таблицы и тем больше памяти потребуется менеджеру блокировок. Поэтому на управляемых блокировках тоже есть эскалация."

Еще можно на ИТС почитать:

"Следует понимать, что, в данном случае речь не идет о реальных записях базы данных. Несмотря на то, что управляемые блокировки описываются в терминах объектов метаданных и их полей, эти блокировки никак не связаны с реальной структурой хранения данных 1С:Предприятия в СУБД. Это всего лишь записи о том, что заблокировано «нечто».

Иногда можно провести аналогию между управляемыми блокировками и реальными записями СУБД. Например, для объектных данных блокировка объекта с указанной ссылкой будет «соответствовать» блокировке всех записей, содержащих указанную ссылку, во всех таблицах этого объекта метаданных (в основной таблице и в таблицах его табличных частей).

Однако в других случаях провести такую аналогию достаточно затруднительно, да и не нужно. Например, блокировка регистра бухгалтерии с указанием значения вида субконто. Достаточно понимать, что накладывая такую блокировку мы запрещаем другим транзакциям каким-либо образом изменять «записи» регистра бухгалтерии, у которых значение вида субконто равно указанному нами. Как при этом данное условие «проецируется» на реальную структуру данных регистра бухгалтерии - для нас совершенно не важно.

При установке новых блокировок менеджер анализирует имеющиеся блокировки. Если оказывается, что «нечто», что мы пытаемся заблокировать, уже заблокировано ранее, сравниваются режимы существующей и новой блокировок. Если режимы совместимы - новая блокировка устанавливается. Если режимы не совместимы - новая блокировка ожидает снятия существующей блокировки. "
triviumfan; +1 Ответить
29. triviumfan 29 08.08.22 16:04 Сейчас в теме
(28) Благодарю! А можно ссылку на курс? Это ведь старый курс по оптимизации производительности?
30. kholkin 150 08.08.22 16:15 Сейчас в теме
(29) Да, старый курс. Он сейчас уже не продается, насколько я знаю. Наша компания покупала, поэтому могу посмотреть.
31. triviumfan 29 08.08.22 16:57 Сейчас в теме
(30) Нашёл в закромах старый "Ускорение и
оптимизация систем на
1С:Предприятие 8.3
Подготовка на 1С:Эксперт по
технологическим вопросам
Версия 2.1.4". Кажется, это он)
32. Andreynikus 1211 08.08.22 17:24 Сейчас в теме
(31)
(27)
Индексы будут влиять только на объекты СУБД, к упр. блокировка они отношения не имеют.
Наверное разработчики предусмотрели какие-то индексы, хеши и пр. оптимизации для служебной таблицы блокировок, но мы на них никак повлиять не можем.
triviumfan; +1 Ответить
22. Andreynikus 1211 05.08.22 15:50 Сейчас в теме
(21)
Значит это явно ошибка платформы, не должно быть такого поведения.
23. kholkin 150 05.08.22 15:52 Сейчас в теме
Оставьте свое сообщение
Вакансии
Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Архитектор 1С
Москва
зарплата от 260 000 руб.
Полный день

Начальник отдела архитектуры
Москва
зарплата от 300 000 руб.
Полный день

Эксперт по технологическим вопросам
Москва
зарплата от 250 000 руб.
Полный день

Ведущий разработчик 1С
Ростов-на-Дону
зарплата от 200 000 руб.
Полный день