Вход | Регистрация
    1  2   

Вопрос по имени пространства блокировок

Вопрос по имени пространства блокировок
Я
   CepeLLlka
 
12.09.21 - 21:45
Добрый вечер. Хочу для себя внести ясность в вопросе блокировок.
В статье на ИТС про блокировки (https://its.1c.ru/db/metod8dev/content/5839/hdoc) есть такие слова:

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

В какой момент нужно использовать пространство с суффиксом НаборЗаписей, а в использовать пространство без суффикса какой нет?

Например в УНФ в модуле набора записей регистра накопления "Запасы" есть вот такой код.

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

Подскажите чего хотели достичь разработчики УНФ установкой такой блокировки?
   mikecool
 
1 - 12.09.21 - 22:00
заблокировать набор записей регистра по регистратору
прям кеп получился )
   CepeLLlka
 
2 - 12.09.21 - 22:01
(1)Ну это понятно, а зачем? :)
   CepeLLlka
 
3 - 12.09.21 - 22:02
в УНФ в каждом регистре накопления такой код, не просто же так, какой-то есть в этом сакральный смысл :)
   mikecool
 
4 - 12.09.21 - 22:08
(2) в смысле - зачем? чтобы не блокировать весь регистр, когда надо изменить только записи, сделанные отделоьным регистратором
   H A D G E H O G s
 
5 - 12.09.21 - 22:11
Чтобы не словить deadlock при повышении уровня изоляции, может быть.
   CepeLLlka
 
6 - 12.09.21 - 22:11
(4)То есть если этого не написать, в момент записи заблокируется весь регистр, верно?
   H A D G E H O G s
 
7 - 12.09.21 - 22:12
(6) нет.
   CepeLLlka
 
8 - 12.09.21 - 22:12
(7)Да я понимаю, хочу спросить это у (4), потому что не понимаю что он хотел сказать в (4)..
   H A D G E H O G s
 
9 - 12.09.21 - 22:14
(8) он далек от всего этого.

(0) есть ли в модуле проведения чтение запросом (ну или даже через набор записей) из этого регистра ?
   H A D G E H O G s
 
10 - 12.09.21 - 22:16
Хотя вроде запрос не ставит управляемую блокировку. Надо смотреть, забыл уже.
   CepeLLlka
 
11 - 12.09.21 - 22:18
(5)Так в какой момент нужно использовать пространство с суффиксом НаборЗаписей, а в использовать пространство без суффикса какой нет?

И будут ли конфликтовать блокировки установленные на пространство с именем которое включает суффикс и блокировки установленные на пространство с именем без суффикса?


(9)Есть конечно, но как в (10) пишете, запрос не ставит блокировку..
   CepeLLlka
 
12 - 12.09.21 - 22:19
Хотя чтение набора записей методом "Прочитать" устанавливается неявная блокировка.. но там конечно запросом всё.
   mikecool
 
13 - 12.09.21 - 22:21
(9) прости, что зашел на твою экспертную дорожку...
   H A D G E H O G s
 
14 - 12.09.21 - 22:27
(12) ну значит предохраняет записи регистра от изменений другой транзакцией на этапе от
ПрочитаноЗапросом
до
ЗаписаноПриЗавершенииТранзакции.

Странно, что кто то будет менять записи регистра с отбором по чужому регистратору, но пусть это будет какое нибудь регламентное задание.
   CepeLLlka
 
15 - 12.09.21 - 22:35
(14)Про регламентное задание это очень даже возможно, правильная мысль..

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

Я вообще даже подумал что это что-то по типа "объектная блокировка" на записи регистра сделанные этим регистратором.

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

В общем идея с регламентным заданием очень даже помогает в дальнейших рассуждениях, спасиб.
   H A D G E H O G s
 
16 - 12.09.21 - 22:38
(15) Ты не понял.

Запрос прочитал движения этого регистра в первой транзакции.
В это время другая транзакция их поменяла.

Первая транзакция работает с устаревшими данными.
   H A D G E H O G s
 
17 - 12.09.21 - 22:39
Например, поиск и замена значений
   CepeLLlka
 
18 - 12.09.21 - 22:50
(16)Ну вроде доходит потихоньку..

Пытаюсь сообразить :)

Как я понимаю, вот эта блокировка:

//Установка исключительной блокировки текущего набора записей регистратора.

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Запасы.НаборЗаписей");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Регистратор", Отбор.Регистратор.Значение);
Блокировка.Заблокировать();

Может конфликтовать только с такой-же блокировкой, установленной на конкретный набор записей этого регистратора.

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

Верно?
   CepeLLlka
 
19 - 12.09.21 - 22:52
С другой стороны, при записи и так сработает неявная блокирвка..
   CepeLLlka
 
20 - 12.09.21 - 23:13
Ну в общем в (18) всё верно, но только пример с поиск и замена значений не очень, а вот регламентное задание которое обрабатывает движения документов как раз подходит.
   rphosts
 
21 - 13.09.21 - 04:30
(14) например перепроведение
   rphosts
 
22 - 13.09.21 - 04:34
(20) не только, сделали движения по РН, к примеру, и кто-то до выполнения контроля изменил измерение... проверка остатков покажет что минусов по измерениям документа нет, а по откорректированным измерениям вполне может быть и минус...
   CepeLLlka
 
23 - 13.09.21 - 12:56
(22)Это не то, это блокировка не для контроля остатков, никакой блокировки по измерениям нет.
Блокируются только конкретный набор записей.

Эта блокировка устанавливается для проведения ответственного чтения в том случае, если вдруг этот наборзаписей уже записывается например обработкой ПоискИЗаменаЗначений или какой другой.. либо может регламентным заданием.

Дима сказал всё верно.
   CepeLLlka
 
24 - 13.09.21 - 18:06
Ну а вообще апну :) Может кто опытный зайдёт поправит мои умозаключения или просто выскажет свои мысли по этому поводу.
   Вафель
 
25 - 13.09.21 - 18:30
Набор записей руками блокировать не нужно. Оно автоматом
   CepeLLlka
 
26 - 13.09.21 - 18:41
(25)Мы ничего не блокируем, мы устанавливаем управляемую блокировку..
Ну и если так рассуждать то создатели УНФ фигню там написали :) Примерно как я в (15) :)
   Конструктор1С
 
27 - 13.09.21 - 20:09
(0) движения документа могут меняться вне основного проведения. Например, при отложенном проведении по отдельным "тяжелым" регистрам. Тут нужно юзать .НаборЗаписей. Без оного в остальных случаях. Примерно так
   acanta
 
28 - 13.09.21 - 20:15
Зачем тяжелые регистры вообще в риб регистрировать, не говоря уже об отложенном проведении?
   CepeLLlka
 
29 - 13.09.21 - 21:31
(27)Нет, не согласен с этим. Для контроля остатков там нормально используют БлокировкаДанных
А это нечто другое, скорее всего то, что я написал в (23), но конечно есть сомнения так как я недавно начал вникать в блокировки и полного понимания ещё нет, поэтому и создал эту тему.
   Конструктор1С
 
30 - 14.09.21 - 05:45
(29) c чем не согласен, с отложенным проведением по части регистров? Ну так это распространённая метода. Это не для контроля остатков, а чтобы снизить нагрузку и повысить параллельность во время активности пользователей. Для контроля остатков БлокировкаДанных не юзают, у наборов записей регистров накопления и регистров бухгалтерии есть свойство .БлокироватьДляИзменения, это свойство автоматически сгенерит нужную управляемую блокировку
 
 
   H A D G E H O G s
 
31 - 14.09.21 - 11:16
(30) отличный пример введения в заблуждение.

БлокироваДляИзменения "всего лишь" убирает РазделительИтогов из управляемой блокировки при записи НабораЗаписей, чтобы не напороться на deadlock потом, при запросе контроля остатков.
   H A D G E H O G s
 
32 - 14.09.21 - 11:19
(30) есть БлокировкаДляИзменения, или нет ее - управляемая блокировка все равно будет наложена, просто с этим включенным флагом она будет наложена на все накопленные разделители итогов набора записей.
А если для регистра не включено разделение итогов - то и вообще в ней смысла нет.
   Олеша Попович
 
33 - 14.09.21 - 12:24
(31) >>чтобы не напороться на deadlock потом, при запросе контроля остатков.

Дедлоки тут вообще никаким боком.
   CepeLLlka
 
34 - 14.09.21 - 12:38
(30)Ну если не для контроля остатков, то тогда согласен, да.
Про БлокироватьДляИзменения с вами согласен, с (31) не согласен.. В статье на ИС про это свойство написано неверно, там парень ошибается. Верно как раз так, как говорит Конструктор1С

(33)С вами тоже не согласен, дедлоки тут очень даже, если СУБД использует метод блокировки для изоляции транзакций.
В статье как раз про это и пишут, и это верно там.

А вот то что БлокироватьДляИзменения НЕ устанавливает явную, исключительную, управляемую блокировку - неверно.
Достигаемый эффект конечно будет одинаковый, но в голове я считаю нужно для себя правильно это понимать. Поэтому та статья вредная, лучше не читать её на ранних стадиях изучения управляемых транзакционных блокировок, может ввести в заблуждение.
   H A D G E H O G s
 
35 - 14.09.21 - 12:42
(33) Это сейчас, в версионнике они никаким боком. В 8.2 были бы deadlock
   Олеша Попович
 
36 - 14.09.21 - 12:42
(35) тем не менее цель установки этого свойства другая
   H A D G E H O G s
 
37 - 14.09.21 - 12:43
(34) Сейчас поглядим
   H A D G E H O G s
 
38 - 14.09.21 - 12:50
https://prnt.sc/1s5him9
Первый раз БлокироватьДляИзменения=Истина
Второй раз БлокироватьДляИзменения=Ложь
   H A D G E H O G s
 
39 - 14.09.21 - 12:51
(36) Расскажите
   CepeLLlka
 
40 - 14.09.21 - 12:51
При установке этого свойства, при записи движений ВЗАМЕН СИСТЕМНОЙ, неявной, платформенной блокировки будет попытка установки ЯВНОЙ блокировки. Вот и вся разница.
   CepeLLlka
 
41 - 14.09.21 - 12:53
Вообще конечно хочется ему там в статье написать, объяснить.. чтобы он не путал людей лишний раз, зачем сбивать с мыслей новичков в этой теме.
   H A D G E H O G s
 
42 - 14.09.21 - 12:54
(40) Держи.
https://disk.yandex.ru/d/xk3N9YReFX0xcA

проведи док с галочкой и без, собери ТЖ и скажи мне, где там Системная и где там Явная блокировка.
   CepeLLlka
 
43 - 14.09.21 - 12:55
(42)В ТЖ не отражается разница между системными и явными.
   H A D G E H O G s
 
44 - 14.09.21 - 12:55
(41) Все в статье верно и воспроизводится.
   H A D G E H O G s
 
45 - 14.09.21 - 12:56
(43) Я могу написать это на партнерку и меня не поднимут на смех?
   Олеша Попович
 
46 - 14.09.21 - 12:57
(39) чтобы не было отрицательных остатков, если включен разделитель итогов
   Конструктор1С
 
47 - 14.09.21 - 12:57
(31) вот уж действительно, не надо вводить в заблуждение своими "я так понимаю". Справка:

БлокироватьДляИзменения (LockForUpdate)
Использование:
Чтение и запись.
Описание:
Тип: Булево.
Устанавливает режим, при котором в процессе записи набора будет установлена управляемая блокировка для всех комбинаций измерений в соответствии с записями набора записей. Имеет смысл использовать, если проверка итогов регистра выполняется после записи и заблокировать нужно именно те комбинации, по которым записываются записи. В этом случае можно не использовать объект БлокировкаДанных.
   CepeLLlka
 
48 - 14.09.21 - 12:58
(45)Ну я думаю на смех не поднимут, но репутацию свою портить не стоит. Лучше попробуй попытаться понять, что я говорю, а не слепо отрицать это.

Давайте разбираться, откуда у вас вообще такие мысли что БлокироватьДляИзменения что-то отключает, игнорирует?
   CepeLLlka
 
49 - 14.09.21 - 13:00
Как уже пишут в (47) в СП, вот в этой статье ещё например - https://v8.1c.ru/platforma/upravlenie-blokirovkami-v-tranzakcii/
Пишут всё верно, но автору статьи на ИС это походу по барабану.

Так-же он сам приводит статью описывающую механизм разделителя итогов, вот она - https://its.1c.ru/db/metod8dev/content/1393/hdoc

Ну и в ней есть такие слова:
Данный механизм работает только при записи движений. При обращении к итогам регистров в запросе блокировка накладывается на все записи с используемыми комбинациями измерений. И это соответствует сути решаемой задачи. Например, при проведении расходной накладной средствами встроенного языка выполняется считывание остатков для проверки возможности продажи товара. В этом случае блокировка не позволит провести расходную накладную параллельно с другой расходной накладной или приходной накладной, если имеются пересекающиеся комбинации  измерений. И это правильно, потому что, расходную накладную номер 5 нельзя проводить параллельно с приходной накладной 1 и приходной накладной 5, так как необходимо обеспечить логическую проверку наличия товара на складе, так чтобы никто не мог поменять считанный остаток до конца транзакции проведения расходной накладной. Таким образом, механизм разделения итогов исключает блокировки, устанавливаемые для поддержки актуальных итогов (решения системной задачи), но не исключает блокировки, накладываемые для решения задач бизнес-логики.

Аналогичная логика поддерживается и при использовании управляемого режима блокировки. Из встроенного языка доступна блокировка только по измерениям (без учета разделения итогов по отдельным записям).

Если вдумчиво прочитать, то всё становится на свои места.
   Олеша Попович
 
50 - 14.09.21 - 13:02
(47) Там так написано, как будто без установки свойства БлокироватьДляИзменения управляемая блокировка для всех комбинаций измерений не устанавливается. А про Splitter ни слова
   CepeLLlka
 
51 - 14.09.21 - 13:14
В общем при попытке установки системной блокировки(неявной, когда платформа это делает за нас), в поля блокировки попадает поле "разделитель(сплиттер)", а при попытке установки блокировки из встроенного языка, то есть явной блокировки, в поля блокировки "разделитель(сплиттер)" не попадает и тем самым мы пытаемся захватить все записи по заданным измерениям.

(38)А вообще в (43) я не уверен, могу ошибаться.
Если вдруг всё же есть возможность в ТЖ или каким другим способом определить системная блокировка или явная была установлена, это бы развенчало все споры.
   H A D G E H O G s
 
52 - 14.09.21 - 13:15
(46) В 8.3 - да. Про deadlock я написал для 8.2, когда был "блокировочник" (плохое название). Признаю, надо было писать про 8.3, так как эта коллизия опаснее и неявна.
   H A D G E H O G s
 
53 - 14.09.21 - 13:16
В интернете кто-то не прав.
Ладно, вы все правы, я во всем ошибался.
Всем хорошего дня, у меня много других дел.
   CepeLLlka
 
54 - 14.09.21 - 13:31
(53)Мы не правы, мы разбираемся как и ты.. Я не для того спрашиваю чтобы оказаться правым или нет.. Я даже рад оказаться неправым, лишь бы этому было подтверждение и мы во всё разобрались. И у нас в голове стал порядок в этом вопросе.

Но лучше конечно вечерком если будет интерес разобраться..
   H A D G E H O G s
 
55 - 14.09.21 - 13:59
Поиграйся вот с этими РТУ, может станет ясно
https://disk.yandex.ru/d/xk3N9YReFX0xcA
   CepeLLlka
 
56 - 14.09.21 - 17:31
(30)Тяжёлые регистры вряд-ли.. я же пишу в (3) что там такое в каждом регистре..

В РН "БонусныеБаллы" например..
   CepeLLlka
 
57 - 14.09.21 - 17:42
(52)Я вот этому поводу хотел бы спросить.. Это относится к файловой версии, да?

Потому как я пару дней назад при работе с базой 1С на платформе 8.3 используя клиент-сервер и СУБД MS SQL EXPRESS, руками поменял параметр базы(READ_COMMITTED_SNAPSHOT) у меня оно там называется "Изоляция моментальных снимков read committed включена" в ложь и как я понял после этого вариант изоляции транзакций стал блокировочным, а не версионным.. Так как я словил взаимоблокировку..

Или это я неверно понимаю ситуацию?
   CepeLLlka
 
58 - 14.09.21 - 17:45
Я имею ввиду как это зависит от платформы? Дайте статью хоть какую-нибудь про это..
   mikecool
 
59 - 14.09.21 - 17:46
а что за версионный уровень изоляции?
   H A D G E H O G s
 
60 - 14.09.21 - 17:48
(57) К серверное конечно.
 
 
   H A D G E H O G s
 
61 - 14.09.21 - 17:48
(58) 8.2 - блокировочник, 8.3 - версионник.
   H A D G E H O G s
 
62 - 14.09.21 - 17:49
(59) Чтение не выставляет S- блокировку, а читает снимок данных до начала транзакции.
   polosov
 
63 - 14.09.21 - 17:50
(58) http://online.1c.ru/books/book/20752408/ потрать немного денег.
А вообще все еще смешно, что до сих пор народ путается в блокировках 1С.
   CepeLLlka
 
64 - 14.09.21 - 17:52
(63)А мы не путаемся, мы пытаемся разобраться, если у вас есть какие-нибудь аргументы подтверждающую одну или вторую версию, приводите их, мы с удовольствием почитаем.
   polosov
 
65 - 14.09.21 - 17:53
(64) У меня нет аргументов. Я вообще тупой программист. Я просто в сторонке постою, посмотрю на умных людей.
   CepeLLlka
 
66 - 14.09.21 - 17:57
(65)Ну хотя бы расскажите какую версию вы считаете верной? :)
   Олеша Попович
 
67 - 14.09.21 - 17:59
(63) Книга ни о чем в плане обучения. Филиппов может и норм спец, но изложение это не его.
   polosov
 
68 - 14.09.21 - 18:01
(67) Not great not terrible(c)
По изложению - вкусовщина. Главное внимательно таблички смотреть.
   Олеша Попович
 
69 - 14.09.21 - 18:04
   Олеша Попович
 
70 - 14.09.21 - 18:05
(68) какие таблички?
   CepeLLlka
 
71 - 14.09.21 - 18:05
(69)Так я про эту статью и говорю, что в ней бредятина
   Олеша Попович
 
72 - 14.09.21 - 18:06
(71) ок
   polosov
 
73 - 14.09.21 - 18:07
(70) В книге же.
   CepeLLlka
 
74 - 14.09.21 - 18:09
(69)На примере могу сказать так.. в этой статье человек сделал неверный субъективный вывод, который подходит к итоговому результату.

Пример могу привести такой:

Тучи закрывают солнце и мы не видим солнечного света. В этой ситуации можно сказать - Тучи выключают солнце! И вроде как подходит, да, тучи пришли, солнца не видно. Но ведь мы же понимаем что солнце всё так-же светит, просто его лучи мы сейчас не видим из-за туч. Итог один, но понимание как он достигнут разное.
   H A D G E H O G s
 
75 - 14.09.21 - 18:13
(74) Гуманитарные концепции тут не работают.
   CepeLLlka
 
76 - 14.09.21 - 18:21
(75)Ну не знай.. мне показалось нормальный пример который показывает что не всегда можно сразу сделать правильный вывод о том в следствии чего получается тот или иной результат. Ну может и плохо про тучи.. хз
   H A D G E H O G s
 
77 - 14.09.21 - 18:24
(76) Я тебе скинул нормальный пример. Ты его смотрел?
   CepeLLlka
 
78 - 14.09.21 - 18:24
(75)Но ведь такие статьи опасны, они вводят в заблуждение, не то что простых 1сников, а даже учителей 1С. Я видел в обучающем видео, как учитель залепил сразу и БлокироватьДляИзменения и воспользовался объектом БлокировкаДанных, так как не понимал видимо, что БлокировкаДаных и так попытается заблокировать все записи без учёта разделителя. То есть по сути научил плохому, излишней блокировке..
   CepeLLlka
 
79 - 14.09.21 - 18:24
(77)Да, я посмотрел, но что я должен понять из этого, я не понял :(
   CepeLLlka
 
80 - 14.09.21 - 18:26
(77)Я проводили такие-же тесты, только без фонового задания, а просто останавливая выполнения кода одной транзакции в отладчике, и запуская параллельный сеанс, как вот в этом видео
https://www.youtube.com/watch?v=u75lqTdBjXc&ab_channel=Веселый1С

Результат мы видим, блокировка происходит.. Я же говорю про то, почему она происходит.
   CepeLLlka
 
81 - 14.09.21 - 18:42
(77)Если что я код просто посмотрел, так как запустить я это не могу же, из-за отсутствия ExtendedFunc.dll как я понимаю, думаю ты в курсе этого.
   H A D G E H O G s
 
82 - 14.09.21 - 18:45
(80) Потому что когда мы выставляем флаг БлокироватьДляИзменения, в наборах записей происходит пересечение областей блокировки по одинаковым значениям измерений. Вот поэтому происходит блокировка, которая нас не допускает до преждевременного выполнения запроса остатков. 1 транзакция ждет, пока вторая транзакция запишет свои расходыв базу и запрос будет выполняться с учетом этих расходов.

Если мы не выставляем флаг БлокироватьДляИзменения, области блокировок не пересекуться, так как к измерениям добавиться Разделитель, 1 транзакция не будет ждать 2 транзакцию и запрос контроля остатков выполнит без учета расходов 2 транзакции.
   H A D G E H O G s
 
84 - 14.09.21 - 18:50
(81) Пардон, вот с компонентой
https://disk.yandex.ru/d/xk3N9YReFX0xcA
   CepeLLlka
 
85 - 14.09.21 - 20:39
(82)Всё верно, именно так.

Подчеркну ещё раз то, в чём мы пытаемся разобраться и попытаюсь более подробно донести свою позицию.

Весь вопрос в том, ПОЧЕМУ при использовании БлокироватьДляИзменения = Истина, из полей блокировки исключается поле "разделитель"? Ведь благодаря этому и происходит конфликт блокировок.


1ый вариант. Вариант автора статьи на ИС и как оказалось не только на ИС. см.(69) автор в конце статьи.

Это происходит благодаря тому, что свойство БлокироватьДляИзменения игнорирует разделитель итогов, отключает этот механизм для блокируемых записей, и вообще неверно называется это свойство, и никакую блокировку оно не производит, а набор записей автоматически блокируются платформой при записи.
А то что в СП про это свойство написано по другому это потому что возможно "...чтобы не усложнять жизнь начинающим разработчикам :)"



2ой вариант. Официальный от 1С.

Описание из СП. Устанавливает режим, при котором в процессе записи набора будет установлена управляемая блокировка для всех комбинаций измерений в соответствии с записями набора записей.

Другими словами из статьи по ссылке - https://v8.1c.ru/platforma/upravlenie-blokirovkami-v-tranzakcii/
Действие этого свойства аналогично тому, как если бы разработчик самостоятельно установил (прописал в коде) нужные управляемые блокировки 1С:Предприятия 8. Необходимую управляемую блокировку платформа установит автоматически при записи этого набора записей. В результате другие управляемые транзакции, использующие аналогичную блокировку, не смогут начать читать этот регистр, пока не закончится текущая транзакция.

Прочитав статью про разделитель итогов - https://its.1c.ru/db/metod8dev/content/1393/hdoc

"Данный механизм работает только при записи движений. При обращении к итогам регистров в запросе блокировка накладывается на все записи с используемыми комбинациями измерений. И это соответствует сути решаемой задачи. Например, при проведении расходной накладной средствами встроенного языка выполняется считывание остатков для проверки возможности продажи товара. В этом случае блокировка не позволит провести расходную накладную параллельно с другой расходной накладной или приходной накладной, если имеются пересекающиеся комбинации  измерений. И это правильно, потому что, расходную накладную номер 5 нельзя проводить параллельно с приходной накладной 1 и приходной накладной 5, так как необходимо обеспечить логическую проверку наличия товара на складе, так чтобы никто не мог поменять считанный остаток до конца транзакции проведения расходной накладной. Таким образом, механизм разделения итогов исключает блокировки, устанавливаемые для поддержки актуальных итогов (решения системной задачи), но не исключает блокировки, накладываемые для решения задач бизнес-логики."

мы понимаем что существует блокировки для решения системной задачи и для решения задач бизнес логики.
Блокировки которые платформа ставит для решения системной задачи(как раз та платформенная блокировка упомянутая в варианте от автора статьи), игнорируются механизмом разделения итогов.
А вот блокировки устанавливаемые для решения задач бизнес-логики, то есть те блокировки которые пишет разработчик(платформа же не отвечает за бизнес-логику), механизм разделения итогов не исключает и происходит конфликт блокировок.

Исходя из вышенаписанного делаю вывод, что будет установлена управляемая блокировка(для решения задачи бизнес-логики - контроля остатков) как я понимаю ВМЕСТО неявной блокировки и благодаря этому, произойдёт конфликт блокировок.

То что свойство называется "БлокироватьДляИзменения" понятно, потому что это аналог конструкции "ДЛЯ ИЗМЕНЕНИЯ" в запросе, которая использовалась до управляемых блокировок. Её нужно было использовать
чтобы передать команду СУБД установить блокировку на читаемые значения.
Из статьи - https://its.1c.ru/db/metod8dev/content/5839/hdoc

При этом разделяемая блокировка устанавливается для того, чтобы данные не были изменены другими транзакциями. Исключительная блокировка, помимо этого, обеспечивает запрет не только изменения этих данных, но даже их чтения другими транзакциями, устанавливающими управляемые блокировки. Можно сказать, что исключительная управляемая блокировка является средством борьбы с конфликтами блокировок (deadlock) и может использоваться аналогично ключевому слову ДЛЯ ИЗМЕНЕНИЯ языка запросов в режиме автоматических блокировок.
Следует помнить, что чтение данных другими транзакциями будет невозможно только в том случае, если в других транзакциях устанавливаются несовместимые управляемые блокировки. Если управляемые блокировки в других транзакциях не устанавливаются, то чтение будет возможно. Это аналогично тому, как конструкция ДЛЯ ИЗМЕНЕНИЯ препятствует чтению данных не любыми запросами, а только теми, которые тоже используют конструкцию ДЛЯ ИЗМЕНЕНИЯ.




Итак, что по итогу мы имеем?
Описание из СП платформы 1С говорит что будет установлена блокировка.
Описание из статьи с сайта 1С говорит о том, что будет установлена блокировка.
Описание механизма разделения итогов с ИТС говорит нам о том, что механизм разделения итогов исключает одни блокировки, и не исключает другие блокировки(Не говорится что есть некое свойство отключающее механизм разделения итогов)
Название говорит нам о том, что мы хотим что-то Заблокировать Для Изменения.

Автор же утверждает обратное.
"Много путаницы возникает из-за названия этого свойства, поэтому сразу непонятно как оно работает. В данном случае название не соответствует тому, что свойство делает на самом деле (оно ничего не блокирует, оно игнорирует разделитель), но название соответствует получаемому результату (в итоге получаем блокировку по всем нужным записям)."


В своей работе мне не приходилось сталкиваться с блокировками, так как не приходилось работать с высоконагруженными системами, ну в общем не было опыта.
Сейчас же мне понадобилось понять и изучить этот механизм, я читаю, вникаю, разбираюсь и не могу понять, почему большинство вместо того, чтобы верить данным от разработчика
принимает субъективный взгляд одного человека? Я понимаю что результат один и тот-же, но ошибочное понимание этого процесса мешает правильному пониманию его работы и соответственно
правильно его применять. В статье автор просто ставит в условие что свойство нужно использовать ТОЛЬКО при новой методике контроля остатков, но это не так.
Например я хочу сразу после записи не проконтролировать остатки, а например понять, не превысил ли я лимит чего-нибудь, или поместится результат записи куда-нибудь, да
много разных примеров можно привести, смысл же в том, что установить блокировку и работать с неизменяемыми данными.

В этом видео виден результат прочтения таких вот статей - https://youtu.be/p1aFZSC8qbg?t=3088
На 29:00 и в писании к видео Павел как раз и рекламирует эту статью.

А в видео он по факту ставит лишнюю блокировку(видимо не понимая что БлокировкаДанных которую он ставит, и так не будет исключена механизмом разделения итогов) на записи которые будут удалены при записи регистра, и соответственно на эти записи будет наложена блокировка и параллельно никто по этим записям приходную накладную уже не проведёт.

Павла я ни сколько не хочу упрекнуть в чём-то, просто возможно он не сделал бы такой ошибки, если бы не доверился статье, и все кто его смотрит не перенял бы этот опыт.
Ему конечно же ОГРОМНЕЙШЕЕ спасибо за его труд, за то что он многих из нас сделал 1Сниками.
   ДенисЧ
 
86 - 15.09.21 - 06:00
   CepeLLlka
 
87 - 15.09.21 - 07:28
(86)Денис, доброе утро. Ссылку на это видео я уже давал в этой теме в посте (80)
Что вы хотели этим сказать? :)

Автор видео кстати не в курсе того, что бывают разные варианты реализации изоляций транзакций в СУБД. Иначе он бы не удивлялся тому, что блокировка при чтении не происходит.
   CepeLLlka
 
88 - 15.09.21 - 07:30
Чёт на (85) никакого дальнейшего обсуждения не последовало.. Либо я плохо объясняю, либо хз..

Попробую как вариант оформить это в виде статьи на ИС, может быть там люди ткнут меня носом, направят на путь истинный приведя неопровержимые факты.
   2mugik
 
89 - 15.09.21 - 09:02
(88)Очень много буков. По поводу блокировок - 1С по моему  Объясняет все наполовину. И на этой почве кстати появляются товарищи которые не проясняют а не понятно вообще что делают еще и деньги берут. Если хочешь докопаться так сказать до конца, надо наверное читать что-то типа блокировки в мс скл.
   CepeLLlka
 
90 - 15.09.21 - 12:32
(89)Так в (85) и не пособие по блокировкам, это рассуждения на тему того, как неверно можно истолковать поведение программы и ввести в заблуждение группу людей.

У нас разговор про управляемые блокировки в 1С, причём тут блокировки в МС СКЛ? Управляемые блокировки в 1с только называются блокировками, по факту они ничего не блокируют, это механизм который позволяет работать с СУБД с более низким уровнем изоляции транзакций и в тоже время обеспечивать неизменность данных тогда когда это необходимо.
   H A D G E H O G s
 
91 - 15.09.21 - 12:48
   CepeLLlka
 
92 - 15.09.21 - 12:51
(91)Не конструктивно же :)
Давайте по существу, что вам не понравилось в (90)? :)
   ДенисЧ
 
93 - 15.09.21 - 12:52
"Управляемые блокировки в 1с только называются блокировками, по факту они ничего не блокируют"
Мдя...
   H A D G E H O G s
 
94 - 15.09.21 - 12:52
(92) "по факту они ничего не блокируют"
   H A D G E H O G s
 
95 - 15.09.21 - 12:52
(94) Это аналогично выражению "блокировки в SQL только называются блокировками, по факту они ничего не блокируют"
   CepeLLlka
 
96 - 15.09.21 - 12:53
А что они по вашему блокируют?
Если установлена управляемая блокировка записи из базы нельзя удалить?
   H A D G E H O G s
 
97 - 15.09.21 - 12:53
Или mutex-ы в winapi только называются mutex-ами, по факту они ничего не mutex-уют.
   CepeLLlka
 
98 - 15.09.21 - 12:54
(95)Блокировки в SQL это блокировки в SQL, они блокируют записи. А управляемые блокировки в 1С записи в базе данных не блокируют.
   H A D G E H O G s
 
99 - 15.09.21 - 12:56
(98) Конечно записи они не блокируют. Но они не позволят другой транзакции удалить эти записи, потому что другая транзакция перед удалением попробует тоже установить блокировку.
Один в один как SQL прям.
   H A D G E H O G s
 
100 - 15.09.21 - 12:56
(99) Конечно записи в СУБД они не блокируют.
  1  2   

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.