#0
by ChAlex
Не догоняю для чего это свойство нужно?. По документации:Устанавливает режим, при котором в процессе записи набора будет установлена управляемая блокировка для всех комбинаций измерений в соответствии с записями набора записей. Но...! 1. Блокировка наступит после записи набора, до записи момента записи пофиг что и как установлено. 2. Но если набор записать даже без установки этого свойства на набор автоматически накладывается управляемая блокировка системой по записи. Т.е. Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения=Истина; .... Эквивалентно просто: .... В чем смысл этого свойства?!
#3
by ChAlex
- при чем здесь скуль?. Я про логику 1С. Покажите мне различие поведения 1С с установкой и без установки оного свойства.
#5
by Serginio1
Есть в программировании такое понятие как много читателей один писатель. Так вот это блокировка для чтения, гарантирующая, что во время транзакции с этими данными из других транзакций ничего не произойдет.
#8
by ChAlex
- разжевываю проведенные мной тесты (по временным интервалам, естественно блокировки проводятся в разных документах): Методика работы предлагаемая 1С: (Для теста берем след. код Теперь просто пишем набор Так сказать найдите разницу. Что касается чтения данных - то данные читаются в 1С всегда независимо от блокировок (ну вернее чуть сложнее с учетом работы SQL - на момент записи в таблицу блокируется а потом доступно)
#9
by ChAlex
- сначала не дошла суть сказанного. Действительно чтение остатков не тестировал. Надо попробовать
#10
by Жан Пердежон
в твоем случае разницы нет; а вот если ты будешь контроль остатков делать после записи - разница появится
#12
by Serginio1
Данные читаются так как на них хинт стоит NOLOCK. Если же ты будешь использовать в транзакции то будут ждать. Ты кстати блокировке установи Блокировка.Режим = РежимБлокировкиДанных.Исключительный Исключительный или Разделяемый (Shared)
#13
by ChAlex
- итак в 1-м документ без всяких БлокироватьДляИзменения запись набора во втором: попытка чтения запросом Запрос=Новый Запрос("ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.КоличествоОстаток - результат запрос не выполняется, данные блокированы! Итак вопрос открыт: что дает особенного данное свойство?
#14
by ChAlex
Другими словами: независимо от установки БлокироватьДляИзменения=Истина для набора, данные все равно блокируются в момент записи (причем Исключительно). Поэтому не догоняю смысл использования данного свойства. Можно просто в нужном месте записывать набор записей, при этом система все равно заблокирует данные и разницы в одном и другом случае просто не нахожу. Но ведь она должна бы быть?
#16
by Serginio1
В первом случае у тебя блокировка по умолчанию Исключительный, которая не даст ни читать другим блокировкам ни писать. А вот во втором случае нужно смотреть тип блокировки.
#17
by ChAlex
что не так? в первой транзакции просто запись без всяких установок БлокироватьДляИзменения : Движения.Номенклатура.Записать; во второй транзакции попытка к этим данным обратиться : результат - данные заблокированы (да и должно бы быть - вед идет запись, тут сам бог велел). Речь идет исключительно об управляемых блокировках.
#18
by ChAlex
Вопрос когда ж нужно использовать БлокироватьДляИзменения? То есть, тот случай, когда данные не блокируются просто при записи набора? Вот этого никак нащупать не могу?
#21
by ChAlex
единственный момент для регистра не установлен разделение итогов. Сейчас попробую с установленным флагом
#23
by ChAlex
То бишь схема с установкой БлокироватьДляИзменения и без оной работает абсолютно одинаково (ну или я не нахожу различий). Так в чем же сакральный смысл в БлокироватьДляИзменения? :)
#25
by GROOVY
Сдается мне у тебя что то с технологией тестирования. В противном случае ты бы увидел блокировку на чтение, как это описано в документации.
#26
by Жан Пердежон
в общем, если у тебя стоит разделение итогов, первая транзакция - реализация, с контролем остатков после записи, то, если поступление пройдет между записью и контролем - контроль будет кривой;
#27
by ChAlex
- так я и так вижу блокировку на чтение. Я так предполагаю, если не устанавливать режим БлокироватьДляИзменения то в этом случае должна быть мене жесткая блокировка (иначе зачем тогда это свойство), но с другой стороны ведь идет запись набора (тут по любому должна бы быть полная блокировка на данные). Не догадываюсь как 1С хотела с этим разрулить, но не в этом суть. Технология тестирования простая - создаю документ и провожу (в регистр пишу расход по одному товару) и просто набор зписываю (без БлокироватьДляИзменения), после этого делаю останов (до выхода из обработчика проведения) что бы во втором документе при проведении прочитать остатки по записанному товару в первом документе. (запросом, ну аналогично можно попробовать заблокировать набор). В результате получаю правильную блокировку данных. Такое же поведение я ожидаю при установке БлокироватьДляИзменения перед записью набора в первом документе. Но результат теста показывает одинаковое поведение.
#28
by ChAlex
- вы близки к истине, только объяснения не совсем понятны. В общем, разобрался с данной ситуацией. Итак резюме: 1. С точки зрения чтения данных и блокировки данных (именно "БЛОКИРОВКИ" как объекта 1С) - тут использование данного свойства не имеет смысла (что без его использования, что с его использованием поведение 1С одинаковое, а именно исключительная блокировка по всем комбинациям измерений). 2. Использование данного свойства имеет смысл только при "Разрешении разделении итогов" для регистра. И все, что оно делает, так это запрещает параллельную запись в регистр по комбинации измерений. Если не разрешено разделение итогов, то данное свойство так же не имеет смысла, ибо в этом случае система тоже блокирует одновременную запись, а вот при разделении итогов - тут запись пройдет, если не установить БлокироватьДляИзменения. Вот и весь сакральный смысл этого свойства. :) Спасибо всем, кто принял участие в дискуссии
#29
by Serginio1
А блокировки Исключительный или Разделяемый это разве не управляемые блокировки? По умолчанию изоляция блокировки Read Commited Была бы изоляция Repeatable read не было бы проблем с повторным чтением поэтому и приходится накладывать блокировки Разделяемый
#30
by Жан Пердежон
смысл - блокировать меньше данных на меньшее время; реализуется как раз с помощью разделения итогов, контроля остатков ближе к концу транзакции и сабжа.
#31
by ChAlex
- не совсем так: разделение итогов и контроль ближе к концу транзакции как бы разные сущности и совсем разное назначение. Разделение итогов как раз позволяет только обойти блокировку наложенную на набор записей, чем достигается параллельная запись в регистр, тем самым обеспечивая большую параллельность вот и все. А БлокироватьДляИзменения - просто блокирует данную возможность (как бы на время отключая разделение итогов). Вот и все.
#32
by Serginio1
Я так понимаю, что БлокироватьДляИзменения все же исключительная блокировка. Но суть получается такая, что если тебе после записи в регистр нужно обратиться к итогам до конца транзакции тебе нужно ее заблокировать. Разницы в для блокировок Исключительный или Разделяемый нет, так как изоляция Read Commited будет дожидаться окончания транзакции так как данные изменены. По идее блокироваться должны и записи в зависимости от свойства "Запись движения при проведении"например Записывать модифицированные будет блокировать только измененные.
#33
by ChAlex
- нет не так. БлокироватьДляИзменения вообще никаким боком к режиму блокировки не относится. При записи набора ВСЕГДА устанавливается блокировка на записываемые данные, и как результат их нельзя получить запросом или заблокировать в другой транзакции. Но есть только одно НО! В случае разделяемых итогов 1С позволит во время блокировки записать набор по тем же измерениям если не установлено БлокироватьДляИзменения. Вот и все! и причем тут глубокие дебри про Read Commited, а Записывать модифицированные и с ними иже си вообще к теме блокировки не имеют никакого значения .
#36
by ChAlex
- я ж и говорю - это относится не к блокировке, а к запрету параллельной записи в регистр в случае разделения итогов регистра
#38
by ВалераОшкин
не, если в режиме автоблокировок запросишь регистр с БлокироватьДляИзменения, то другая запись в регистр станет. Проверял и парился в свое время по этому поводу.
#39
by ChAlex
ну так БлокироватьДляИзменения относится ТОЛЬКО к управляемым блокировкам. И как-то этим пользоваться в автоматических блокировках мысль не посещала
#40
by Serginio1
А при том, что изоляция Read Commited дает читать только неизмененные данные и ели данные изменены то ожидать окончания транзакции. По уму БлокироватьДляИзменения имеет смысл только до записи. После записи уже вступает в силу уровень изоляции Read Commited.
#41
by GANR
Такой вид блокировки имеет смысл если производится вначале запись, а уже потом - контроль отрицательных остатков.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
В этой группе 1С
- Поле ввода - выбор только Группы
- при сохранении конфигурации вылетает конфигуратор
- Не загружает валюту....
- Разделитель учета 1с 8.2
- УПП 8.2 зачем в документе Списание ОС колонка восстановление НДС?
- глЗначениеПеременной. Присвоение переменной определенного значения.
- Динамическое считывание данных
- Информационная база содержит разделители
- КД - глобальная переменная
- v7: как получить всех владельцев по подчиненному справочнику по реквизиту
- Узкие места Сервер1С-Сеть-SQL
- Переход с Бухгалтерии 2.0 на Подрядчик строительства 4.0
- Две кассовые книги в конфигурации 1С82 Бухгалтерия для Украины
- v8: Как в подчинённый справочник при открытии передать владельца?
- Обновление 1с
- Поле HTML документа. Не работает eval()
- Как прочитать значение константы при начале работы системы?
- Макет на ОболочкаActiveDocument - Лист Excel
- Ламерские вопросы по 1С розница 1.0 в вариенте РБД
- Диалог Да/Нет/Отмена на сервере 1С:Предприятие