Простое программное решение проблем с блокировками SQL

Публикация № 1016138

Администрирование - Оптимизация БД (HighLoad)

блокировка блокировки SQL

16
Описание одного из способов программного решения проблемы блокировок при проведении документов в клиент-серверной 1С.

О блокировках, причинах их возникновения и решениях этой проблемы информации очень много, поэтому просто опишу одно из  программных решений, которое реально помогло полностью исключить блокировки по номенклатуре при проведении документов в крупной информационной системе. Метод подходит только для клиент-серверных систем 1С. Протестировано на платформе 1С:Предприятие 8.2 (8.2.19.130), обычные формы.

Решение для случая блокировок по номенклатуре:

1. Добавить новый служебный регистр сведений "БлокировкаПроведенияДокументов". Он не будет содержать данных и необходим только как объект наложения управляемой блокировки. Добавить полные права на этот регистр в общедоступную роль.

2. В начало процедуры "ПриЗаписи" модуля проблемного документа добавить код:

Процедура ПриЗаписи(Отказ)
	Если Проведен Тогда
		Попытка
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.БлокировкаПроведенияДокументов");
			ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
			ЭлементБлокировки.ИсточникДанных = ТабличнаяЧастьНоменклатура;
			ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
			Блокировка.Заблокировать();
		Исключение
			# Если Клиент Тогда
			Сообщить(СокрЛП(Ссылка) +":"+ Символы.ПС + "	Превышено время ожидания возможности проведения! Повторите попытку проведения.");
			# КонецЕсли
			Отказ = Истина;
			Возврат;
		КонецПопытки;
	КонецЕсли; 
	
	//Исходный текст
	//...
КонецПроцедуры

При возникновении блокировок по полям другого типа, необходимо в регистр "БлокировкаПроведенияДокументов" добавить новое измерение соответствующего типа и в процедуре "ПриЗаписи" указать соответствующий источник данных для элемента блокировки.

Всем удачи!

16

См. также

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

Комментарии
Избранное Подписка Сортировка: Древо
3. capitan 1109 06.03.19 10:50 Сейчас в теме
(1)Раздвоение личности в интернете это когда с одного своего аккаунта препираешься в комментариях с другим своим аккаунтом
)
По моему там тоже удивлялись такому костылю.
Возможно конечно и толковому, но в статье нет всех исходных данных чтобы это осознать.
2. capitan 1109 06.03.19 10:43 Сейчас в теме
А как получалась блокировка по номенклатуре при проведении документов, что то пишете в справочник номенклатуры ?
4. capitan 1109 06.03.19 10:56 Сейчас в теме
На первый взгляд у вас получалась взаимоблокировка из-за повышения уровня изоляции транзакции и вы ее прикрыли костылем уведя в таймаут на блокировках.
5. dmitrydemenew 82 06.03.19 12:07 Сейчас в теме
(4)Свой старый аккаунт удалил. По поводу костыля - не соглашусь. Решение необычное - да, но очень простое и результативное. В большей степени адресовано программистам 1С, предпочитающим решать проблемы производительности простой и быстрой корректировкой программного кода 1С. Я не пытаюсь приуменьшить заслуги администраторов, производящих тонкие настройки оборудования или программистов, которые находят и оптимизируют проблемные области кода - у меня у самого в этой области немалый опыт. Но и не вижу причин, чтобы не использовать простые и результативные решения существенно упрощающие жизнь нашим многострадальным пользователям 1С.
6. capitan 1109 06.03.19 12:17 Сейчас в теме
(5)Я к тому что у вас можно найти место как раз в коде и поставить такую же исключительную блокировку на номенклатуру но без регистра
Да в принципе можно и не искать а в этом же самом месте поставить блокировку на справочник номенклатуры
И будет то же самое
CSiER; sergathome; +2 Ответить
26. sergathome 07.03.19 14:40 Сейчас в теме
(6)
Да в принципе можно и не искать а в этом же самом месте поставить блокировку на справочник номенклатуры
И будет то же самое

О!
7. dmitrydemenew 82 06.03.19 12:38 Сейчас в теме
Если Вам известно более простое рабочее и проверенное решение - я, как и многие наши коллеги, буду рад его узнать. Поделитесь :). Только без философии и предположений - решение, проверенное в реальных боевых условиях и полностью исключающее ошибки любых блокировок, включая взаимные.
8. YPermitin 1304 06.03.19 13:29 Сейчас в теме
(0) Забавное решение. Но я бы в продакшн не стал бы такое кидать.


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

Плюс это явно искуственное узкое место в системе. Возможно стоит посмотреть в сторону формирования движений в фоне. А если нужно контролиовать остатки по номенклатуре, то посмотреть в сторону резервирования и использовать этот регистр для блокировки.

Вообщем, решение выглядит как временный костыль :)
9. dmitrydemenew 82 06.03.19 14:40 Сейчас в теме
(8)Как бы мы это лекарство не обозвали, костылем ли, или по-другому - оно лекарство.

Условия работы предприятия на котором это протестировано:
- Круглосуточный режим работы: производство, торговля;
- Размер свернутой рабочей БД - более 400ГБ;
- Средний поток документов движения товаров - более 20 документов в минуту.
- Высокий уровень контроля на уровне программы: обязательный контроль остатков, качества и пр.
- Высокая частота повторений номенклатурных позиций в документах товародвижения;
- Пересечение 3-х высоконагруженных участков:
1. Центр приема заказов - резервирование товаров;
2. Участок производства(уровень автоматизации цехов на базе 1С более 80%) - выпуск продукции, поступление на склад;
3. Участок конвейерной сборки и комплектации на складе(20 АРМ) - перемещение, реализация товаров.
- программные модули товародвижения предельно оптимизированы, отдел программирования 1С - 7 человек.

До внедрения этого "костыля" была подключена система гибких блокировок от Softpoint, без нее программа не работала.
После внедрения "костыля" программа заработала без гибких блокировок.
10. YPermitin 1304 06.03.19 14:44 Сейчас в теме
(9) никого не хотел обидеть. Просто выглядит дейстыительно так, потому что сути проблемы не решило, а просто перевела все проблемы в ожидание общей блокировке на номенклатуре.

P.S. Софтпоинт - настоящие профи. Плохого не посоветуют :)
34. user612295_death4321 14.03.19 21:19 Сейчас в теме
(9) А почему не взлетела если не секрет?

В свое время когда то давно размышлял о покупке этой системы, но в конце концов перевел базу на управляемые блокировки, включил снапшоты, оптимизировал узкие места и про блокировки забыл.
11. dmitrydemenew 82 06.03.19 15:10 Сейчас в теме
Никакой обиды :). Просто многим это решение действительно может помочь - для чего, собственно и выкладывал. А клеймо "костыль" не позволяет относится к описанному решению серьезно. Основное назначение метода - исключить неконтролируемое "отваливание" рабочих сессий построением, с помощью управляемой блокировки, искусственной очереди проведения документов. Другого, более простого способа выполнить эту задачу я не нашел.
12. lunjio 59 06.03.19 20:56 Сейчас в теме
(11) Вы пытались исследовать суть проблемы ? я просто знаю, что некоторые программисты не брезгуют записью справочника в процедуре перед записью и другими извращениями, если вы решили проблему, конечно хорошо, но хотел бы спросить ,а исследовали ли вы суть проблемы, как-то пытались отладить понять ? Почему брезгуете комментариями к такому хитрому и сложному коду ? Я бы с удовольствием сказал спасибо, если бы вы подсказали как докопаться до истины, в таких ситуациях, а то как говорит мой начальник, про проблемный и запутанный во всех смыслах код - туда пришел один программист плюнул, второй, а потом ещё и ты нагадил.
13. dmitrydemenew 82 07.03.19 05:44 Сейчас в теме
Эти 16 строк типового кода не кажутся мне хитрыми и сложными. По- этому, с моей точки зрения, они не требуют особых комментариев. О том, как работает механизм управляемых блокировок написано множество статей. Переносить эту информацию в зону этой публикации я не считаю необходимым. Данная публикация- это не попытка ког то в чем то убедить. Это просто описание очень простого метода, который может реализовать любой программист 1С в любой конфигурации.
14. user803967 07.03.19 09:19 Сейчас в теме
(13), Если описываете метод то будьте добры опишите проблему(а не ее проявление)у и причины по которым проблема решена именно так. Иначе публикация вырождена - это мое мнение, не хочу обидеть вас этими словами.
Если нет понимания причин, нет рассуждения автора то материал который вы предоставили нужен только для галочки, т.к. большая часть читающих сходу не поймет всех нюансов и переключиться на публикации, которые раскрывают суть проблемы.
А насчет решения - сложную систему не всегда можно починить простым методом
Решение в лоб может принести проблему, но затянутую во времени. т.е. это не решение а оттягивание.
23. lunjio 59 07.03.19 13:41 Сейчас в теме
(13)
Ну талмуты расписывать никто не просит, можно было и просто пару комментариев. Такое ощущение вы не вникали в суть этих блокировок, тыкнули пальцем и попали, а теперь хотите поделиться решением, вместо того чтобы отловить реальную проблему. Как именно ваше решение помогает избежать конфликта блокировок можете сказать ?Накладывает их заранее ? Можете сказать одну из вероятных причин ваших блокировок ? Может не это ваше решение решило проблемы, иногда события просто совпадают, допустим кто-то ошибку исправляет или оптимизирует код, приблизительно в это же время и вы накидали это. Раз вы скрин копировали откуда-то, то возникает вопрос - были взаимоблокировки или блокировки ?
15. dmitrydemenew 82 07.03.19 10:24 Сейчас в теме
Эта публикация предназначена исключительно специалистам, у которых есть реальные проблемы при работе 1С, вызванные SQL блокировками и которые понимают, что такое блокировки SQL, чем они вызваны и каковы последствия их возникновения. Если у Вас нет подобных проблем - просто пропустите эту публикацию, она не для вас. Я не хочу устраивать из публикации обучающий курс - нет у меня ни желания, ни времени. По-этому в одном я с Вами полностью согласен: та "часть читающих", которая "сходу не поймет всех нюансов" должна
"переключиться на публикации, которые раскрывают суть проблемы". Ну а после этого - добро пожаловать!
16. a.doroshkevich 455 07.03.19 12:05 Сейчас в теме
В конфигурации установлен Автоматический режим блокировкой данных?
17. dmitrydemenew 82 07.03.19 12:08 Сейчас в теме
режим блокировкой данных - Управляемый
18. acsent 1128 07.03.19 12:46 Сейчас в теме
скриншот ошибки вообще от 7.7
19. dmitrydemenew 82 07.03.19 13:01 Сейчас в теме
(18)Спасибо, скриншот исправил. Давно не видел это сообщение, забыл как выглядит. :)
20. ELInfinito 07.03.19 13:20 Сейчас в теме
Интересное решение. )
Хорошо, что в свое время, когда на заре разбирания с упр. блокировками такое не придумал, а сделал все по "фен-шую".
В сертификации на профа по тех. вопросам есть такое выражение, как "заметание грязи под ковер".
Так вот мне думается, что это подобное решение.
Узкие места в системе никуда не делись, просто добавили некую упреждающую блокировку.
Это решение ВОЗМОЖНО (!) имеет право на существование, когда идет более детальный разбор, а это времянка, но оставлять такое в продакшене….я бы своих порешил )
21. acanta 47 07.03.19 13:31 Сейчас в теме
В вышивании крестиком нитки мулине дорогие (а церковное золотое шитье еще дороже).
Поэтому во времена крепостного права ценились крестьянки, которые тратят минимум материала на изнанку и максимум на рисунок изделия. Есть такой шов "козлик". Простите за офф.
Прикрепленные файлы:
22. dmitrydemenew 82 07.03.19 13:40 Сейчас в теме
У меня к этому противоположное отношение. Очень жаль, что когда-то пытался решить проблему по феншую, потратив кучу времени, нервов и средств на приобретение «правильных» помощников и программных средств. И наоборот, очень благодарен специалистам своего отдела - решение было найдено коллективно.
24. ELInfinito 07.03.19 14:12 Сейчас в теме
(22) Все решается "штатными" средствами.
ЦУП + ТЖ + профайлер.

Пробовали в демо-режиме PerfMonitor от Софтпоинта - интересная программка, но каких конских денег она стоит, это вообще нечто и эти деньги надо платить каждый год...послали лесом. Это единственное стороннее ПО, которое пробовали ради интереса.

Это решение имеет эффект бомбы замедленного действия, ИМХО. Можно говнокодить и вроде как все хорошо...но нет.
Чисто ИМХО. Я б не стал.
sergathome; +1 Ответить
28. sergathome 07.03.19 14:53 Сейчас в теме
(24) все эти шаманские бубны и волшебные палочки хороши в фильмах про гарри поттеров (в маркетинге, ага), однако их волшебство может обернуться против хозяина, это факт. Причём сразу и неожиданно.
36. Rustig 1097 19.03.19 22:53 Сейчас в теме
(24) вы не решаете проблему, вы показываете "путь", который для многих недоступен: ЦУП+ТЖ+профайлер.
Большинство обходится без них. Я думаю, такие и придумывают простые решения, вроде представленной в публикации.
Чтобы вы делали без ЦУПа, оставшись один-на-один с базой?
37. ELInfinito 20.03.19 08:08 Сейчас в теме
(36) Есть ТЖ, мне бы его хватило.
Большинство проблем решается визуальным анализом кода.
Но, бывают ситуации, когда визуальный анализ не помогает, для это есть вышеназванные инструменты.

Так вот, что касается недоступности пути....это больше похоже на нежелание разбираться в инструментах.
Кому он недоступен и по каким причинам ?
А они видятся следующие:
1. Просто тупая лень, когда чел ходит на работу протирать штаны и получать ЗП.
2. На предприятии не могут дать доступ к оснастке сервера и все что у тебя есть - это конфигуратор. Такое часто бывает на предприятиях оборонного значения.
3. Программист пока не знает об инструментах. Есть у меня такой знакомый, в глубинке на заводе работает. Я ему скилл прокачал.
38. Rustig 1097 20.03.19 09:38 Сейчас в теме
может быть, а может и нет
25. dmitrydemenew 82 07.03.19 14:40 Сейчас в теме
Из множества решений любой задачи есть одно самое простое, и именно оно - лучшее. Иногда очень полезно взглянуть за границы своего туннеля восприятия реальности, возможно, это лучшее решение находится именно там. Пока что нет ни одного обоснованного ответа, почему предложенное решение недопустимо, кроме того, что оно не по «фен-шую». У меня, как у специалиста, нет цели задобрить богов 1С, моя главная цель - чтобы пользователи программ, которые я поддерживаю, были максимально удовлетворены работой этих программ.
27. sergathome 07.03.19 14:46 Сейчас в теме
(25) Решение, конечно, допустимо, но, например (6) вам правильно указал - бритвой Оккама вас папа пользоваться не научил. Так и бреетесь топором :)
Регистр - лишний объект. Блокируйте элементы несущего справочника.
29. a.doroshkevich 455 07.03.19 16:29 Сейчас в теме
Ну и без описание проблемы крайне сложно оценить решение.
Если исходить из крайне скупого описания в публикации и комментариях, то такое решение вообще не имеет права на существование.
Проблема не решена 100%. Блокировки ушли, если ушли, совершенно по другой причине.
Такой сюрприз может выпить очень много крови из 1С-ов, которые потом будут разбираться с ситуацией, когда система встанет колом.
Ещё раз повторюсь - без описание проблемы крайне сложно оценить решение...
Без обид.
30. Sloth 6 09.03.19 23:11 Сейчас в теме
Интересны такие моменты:
1. Действительно ли проблема на блокировках СУБД?
2. Если действительно на СУБД, то как до этого дело дошло при управляемом режиме?
3. Если проблема не на уровне СУБД, то от чего нельзя было решить имеющимся средствами, без создания "вспомогательного" элемента?
4. Каким вообще образом было выяснено, что всему виной номенклатура?
31. Vyatcheslav 10 11.03.19 11:57 Сейчас в теме
Соглашусь со всеми коллегами комментаторами. Не понятно, в чем была причина проблем. Отсюда не понятно, что конкретно этот костыль исправляет и в каких случаях. Платформа 8.2 это жирный минус, она же не живет с 2015-ого, у всех давно 8.3, насколько этот костыль актуален для 8.3 и при каких обстоятельствах? Зачем создавать отдельный регистр, почему не накладывать упр.блокировки на существующие данные?
32. dmitrydemenew 82 11.03.19 14:09 Сейчас в теме
Что ж, повторюсь: основное назначение метода - исключить неконтролируемое "отваливание" рабочих сессий построением, с помощью управляемой блокировки, искусственной очереди проведения документов. Другого, более простого способа выполнить эту задачу я не нашел.

Причины возникновения проблем с блокировками конкретном частном случае:
1.Необратимое изменение типовой УПП в процессе перехода с 1С V77 на 82, связанное с переносом множества алгоритмов из V7 и серьезной доработкой конфигурации в течение многих лет разными специалистами. Глобальная автоматизация производственных процессов на базе этой конфигурации.
2.Одновременное проведение любых из 7 видов документов по 5 основным регистрам остатков в произвольной последовательности.
3.Высокий поток документов движения товаров - более 20 документов в минуту.
4.Присутствие нескольких номенклатур, присутствующих в большинстве документов - как следствие частые конфликты при попытке изменения итогов регистров.
5.Регистры, в которые записываются движения, имеют большой размер - десятки миллионов строк и более.

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

Почему используется пустой служебный регистр? - потому, что наложить управляемую блокировку на 1 пустой регистр, более оптимально и безопасно, чем накладывать управляемые блокировки на 5 основных регистров хранения данных с миллионами записей.

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

Большое всем спасибо за попытки анализа и обсуждение, но мне известны абсолютно все тонкости и причины возникновения проблемы в описанной информационной системе.

Без всяких сомнений, данная проблема может быть решена глобальным перестроением алгоритмов работы программы с переводом ее на новую платформу 1С (минимум год на разработку, установку, заполнение данными, переписывание сотни производственных и торговых отчетов, создание и настройку новой схемы обменов - в системе более 40 связанных информационных баз), специалисты по администрированию предложат немало проектов по замене и настройке оборудования. В принципе, можно найти массу решений стоимостью в миллионы или, что более вероятно, в десятки миллионов. Вот только зачем, если проблема решается практически бесплатно за 5 минут с помощью 16 строк абсолютно типового кода?
33. sp18s 12.03.19 09:35 Сейчас в теме
Автор молодец! Решил свою проблему и поделился решением с другим. Как бы оно правильно не называлось, это всё равно "решение проблемы здесь и сейчас". Удачи :)
rintik; WellMaster; +2 Ответить
35. СергейК 51 17.03.19 19:58 Сейчас в теме
Подскажите, правильно я думаю. При высокой повторяемости товаров в документах данная доработка превращается в механизм "одиночного" проведения документов (в один момент может проводится только один документ).
Т.е. в условиях автора его можно заменить блокировкой одного предопределенного элемента справочника без потери производительности?
Блокировать элементы справочника номенклатура наверное можно как предлагали, но тогда редактировать сам справочник станет затруднительно.

В тему управляемых блокировок может кто знает. Как влияет режим совместимости + версия платформы на производительность: имеется сильно переписанная УТ 8.0 в режиме совместимости 8.2 и платформа 8.3.11. Есть ли смысл увеличивать релиз платформы вместо переработки конфигурации для повышения версии режима совместимости?
Оставьте свое сообщение