Версия для печати темы (https://pro1c.org.ua/index.php?s=57f70b5ea951563ada1c64425daf03d5&showtopic=4885)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ 1С:Предприятие 8.2 _ Ускорить 1С нажатием нескольких кнопок 2. Управляемые блокировки.

Автор: Vofka 28.09.11, 18:18

Если прочитать методику перевода конфигурации на управляемые блокировки от 1С - можно там найти много всего интересного и пугающего. На самом деле всё просто: В свойствах конфигурации меняете режим блокировки данных - "Управляемый". Всё. Могу вас поздравить - вы только что перешли на управляемые блокировки. На самом деле всё несколько сложнее - но не на много.



Что здесь не так? Контроль остатков дал сбой. 2-ой документ успел прочитать остатки раньше, чем 1-й успел их записать. При этом увидел, что на остатках 1 штука и спокойно списал их вслед за первым. Стоит оговориться, что по факту блокировки здесь всё-таки будут. 2 документа не смогут списать остатки одновременно, это необходимо для логической целостности БД, но для решения прикладной задачи в данном примере вряд ли полезно.

Теперь постараемся исправить ситуацию - в коде проведения документа пропишем установку эксклюзивной управляемой блокировки непосредственно перед чтением остатков:



При этом 1-я транзакция блокировку успеет установить, а вторая попытается установить блокировку и будет ждать освобождения ресурса, до тех пор пока не завершится 1-я транзакиця. Стоит отметить, что блокировки действуют только до завршения транзакции, и, естественно, блокировки блокируют ресурс только для изменения из других сессий. Всё логично, но паразительно как много людей об этом не знают.

Ну теперь, когда разобрались зачем блокировки нужны остаётся только установить управляемые блокировки там где это нужно: а именно - только там где производится контроль остатков. Если у вас в базе менеджер имеет право провести документ вне зависимости от того есть товар(деньги) на остатках или нет, зачем вам тогда блокировки? Можете их просто не устанавливать, или прописать и закомментировать до лучших времён. Если же у вас производится контроль остатков то как правило это 3-4 регистра, ну максимум 10-ок. Контроль можно подвесить как в общие процедуры и функции, так и в модули набора записей РН. Код предельно простой, открываем синтаксис помошник - смотрим:

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


Собственно всё сразу понятно - блокируем "товары на складх", 1 измерение становим в явном виде, значения 2-х других возьмём из источника данных - ТЧ документа.

Те кто читал книжки по 8.2 наверное помнят о "Новой логике проведения" - когда контроль остатков производится после записи движений документа. Задвались вопросом зачем это? А вот эту же табличку перерисуем так что контоль остатков и блокировка будут после записи движений:



Разница с виду не значительная - прирост производительности получаем за счет того что на время списания остатков (запись их в базу, что, собственно занимает время) блокировки ещё нет. Блокировка возникает позже к концу транзакции, куда вынесен контроль отрицательных остатков, бизнес логике приложения это вполне удовлетворяет.

Зная для чего блокировки нужны можно действительно ими управлять исходя из бизнес задач которые вы решаете. СУБД разрабатываются исходя из предположения обеспечения максисальной защиты данных. В случае если вы, к примеру, осуществляете банковские транзакции блокировки должны быть везде и на максимальном уровне. Лучше заблокировать лишние записи, чем допустить противоречивость данных.

В случае же если вы продаёте булочки или шариковые ручки, на вряд ли вам нужно столь много блокировок. Браком и пересортом по человеческой вине вы теряете в сотни раз больше, чем могли бы в случае одновременного проведения двумя пользователеями двух одинаковых докуметов отгрузки.

Для варьирования между такими разными задачами в СУБД придумали уровни изоляции. Устанавливая уровень изоляции транзакций можно сказать СУБД какие блокировки накладывать в разных случаях (при записи и при чтении в транзакции) в разных случаях накладываются S (можно читать нельзя писать) или X (нельзя ни читать ни писать) блокировки.

Так в автоматическом режиме у вас почти всегда будет уровень изоляции SERIALIZABLE, который будет накладывать X блокировки где нужно и где не нужно, что будет существенно портить вам жизнь

А в управляемом у вас будет READ COMMITED, который будет накладывать и тут же снимать S блокировку при чтении, и X только при записи. Самый хитрый уровень. Быстро накладываемая S блокировка как раз позволяет проверить не наложена ли где на эти данные X блокировка, что и обеспечивает чтение только согласованных данных, как принято для данного уровня изоляции, а в случае если вы прочитали и выполнили действя, рекоммендованные в предыдущей статье, то не будет даже S блокировки при чтении, таким образом на уровне СУБД будет блокироваться только запись во время записи - что правильно и необходимо для сограсованности данных.

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

http://pro1c.org.ua/redirect.php?http://comol.livejournal.com/1013.html

Автор: alex_shkut 21.05.14, 10:31

Спасибо, статья неплохая, как раз нужна такая информация. Хоть статья и старая, но все еще актуальная.
Исправьте ошибки в тексте. А далее я попрошу уточнить некоторые моменты и напишу свои наблюдения.

Цитата(Vofka @ 28.09.11, 19:18) http://pro1c.org.ua/index.php?act=findpost&pid=32907
"Управляемый". Всё. Могу вас поздравить

Не спешите поздравлять - для нача нужно убедиться, что режим блокировок для документов и регистров проставлены правильно. Как минимум - для документов режим "автоматический", а для регистров - "управляемый". Если на документе будет режим "управляемый", а у зависимого регистра "автоматический" - получите ошибку менеджера блокировок.

Цитата(Vofka @ 28.09.11, 19:18) http://pro1c.org.ua/index.php?act=findpost&pid=32907
Я встречал компании в которых был автоматический режим блокировки, при этом слово "замучали блокировки"

Эта ситуация нормальна для ФАЙЛОВОГО варианта БД и в файловом варианте вообще нет смысла в управляемых блокировках. БД блокируется на уровне таблиц и выигрыша от управляемых блокировок не будет никакого. Паралельная работа невозможна. Поэтому, в начале статьи я бы сразу сделал ударение, что все это имеет смысл только на клиент-серверном варианте. В случае использования СУБД PostgreSQL - это крайне необходимо. Иначе она будет вести себя как файловая.
Спасибо за внимание и за статью.

Автор: Vofka 21.05.14, 12:11

Цитата(alex_shkut @ 21.05.14, 11:31) *
Исправьте ошибки в тексте.

Статья копировалась с первоисточника, ошибки копировались оттуда же. Так что как в песне Сектор Газа
Цитата("Сектор газа - <<Бомж>>")
... пусть остается как было

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua