Как заблокировать запись регистра сведений на чтение? #683219


#0 by decdmb
Необходимо заблокировать выбираемую запись из периодического независимого регистра сведений на чтение (у конфы стоит режим упр. блок. - Автоматический): ВЫБРАТЬ ПЕРВЫЕ 1     СтатусыДокументовСрезПоследних.Объект,     СтатусыДокументовСрезПоследних.Период,     СтатусыДокументовСрезПоследних.Статус ИЗ     РегистрСведений.СтатусыДокументов.СрезПоследних КАК СтатусыДокументов Про ДЛЯ ИЗМЕНЕНИЯ написано: Предложение ДЛЯ ИЗМЕНЕНИЯ предназначено для указания необходимости блокировки считываемых в транзакции данных. Считанные данные становятся недоступными для чтения в других сессиях. Для файлового варианта блокируются указанные таблицы, а для клиент-серверного варианта — только выбранные записи. Блокировка снимается после завершения транзакции. Что означает "Блокировка снимается после завершения транзакции."? Т.е. чтение из регистра необходимо завернуть в НачатьТранзакцию - ЗафиксироватьТранзакцию? Но про НачатьТранзакцию написано: Транзакция предназначена для записи в информационную базу согласованных изменений. Про блокировку на чтение не указано.
#1 by Wobland
на вот тебе слова умного человека о блокировках
#2 by decdmb
Там про управляемые
#3 by decdmb
Можно ли использовать объект БлокировкаДанных при Автоматическом режиме и будет ли он работать?
#4 by ProgAL
Смысл в том что в каждом куске кода где вы хотите запретить чтение записи РС, предварительно надо делать внутри ваш запрос с ДЛЯ ИЗМЕНЕНИЯ ЗафиксироватьТраназакцию; Аналогичный код должен быть во всех местах разных обработок или где откуда вы читаете свой регистр сведений. Либо такой код ставите в одну конкретную обработку, при этом другой экземпляр обработки, запущенный другим пользователем, будет ждать завершения траназкции в первом экземпляре обработки.
#5 by ProgAL
Если вы свой код вызываете из обработки проведения или другого события , начинающего неявную транзакцию, то конструкции начать/зафиксировать транзакцию не нужны.
#6 by decdmb
Понятно, просто смутило в описании НачатьТранзакцию - Транзакция предназначена для записи в информационную базу согласованных изменений. Про чтение там не  написано.
#7 by ProgAL
Код чиения выполняется только после наложения блокировки. В этом и весь смысл. Если блокировка не накладывается, то происходит ожидание на блокировке, либо дожидаемся когда она сможет наложится и выполнится нижестоящий код на чтение, либо отвалимся по таймауту.
#8 by MrStomak
ДЛЯ ИЗМЕНЕНИЯ не блокирует запись на чтение.
#9 by Господин ПЖ
>ДЛЯ ИЗМЕНЕНИЯ не блокирует запись на чтение. здрасти приехали... shared и sharedforupdate между собой уже не совместимы
#10 by MrStomak
они совместимы:
#11 by Ненавижу 1С
блокирует, проверил даже снова а вот в списках форм действительно не блокируется
#12 by MrStomak
Напиши в microsoft, что у них неверная таблица совместимости ;) U блокировка несовместима с другой U и с X. То есть запрос без конструкции "Для изменения" в транзакции легко сможет прочитать эти данные.
#13 by Господин ПЖ
>а вот в списках форм действительно не блокируется там везде nolock впендюривается...
#14 by MrStomak
Да хоть Serializable, это не более чем RangeS будет..
#15 by Ненавижу 1С
точно, в обоих случаях писал ДЛЯ ИЗМЕНЕНИЯ
#16 by Господин ПЖ
я предлагаю не валить в кучу уровень изоляции и вид блокировки
#17 by бомболюк
+100500 истина в последнем абзаце. к сожалению от чтения с nolock спасет только запуск реиндексации нужной таблицы, что лежит за рамками штатных возможностей в рантайме. надо везде при чтении ставить ДЛЯ ИЗМЕНЕНИЯ тоже.
#18 by MrStomak
К чему тогда пассаж про nolock?
#19 by Господин ПЖ
я вот не помню "для изменения" во что трансформируется
#20 by Ненавижу 1С
меня другое смущает, вот код: и такой же код для другой валюты, написано что для скуля должно блокировать выбранные строки, а оно блокирует усе, но ведь валюты же разные!
#21 by Господин ПЖ
SIU?
#22 by Господин ПЖ
зависит от размера таблицы и ее строения... РС блокируется диапазонами... записи одной даты блокируются все насколько я помню
#23 by MrStomak
если на serializable выполняется, то заблокирует соседние записи кластерного индекса вдовесок.
#24 by Господин ПЖ
это специальный случай имхо... чистый селект + нолок
#25 by MrStomak
nolock это указание СУБД использовать READ UNCOMMITTED. Я возразил, что это не влияет, даже Serializable в этом случае прочитает. Потом ты говоришь, что не надо приплетать уровни изоляций. Это несколько противоречиво.
#26 by Господин ПЖ
>говоришь, что не надо приплетать уровни изоляций я писал что не надо валить в кучу. а не "приплетать"
#27 by Господин ПЖ
>nolock это указание СУБД использовать READ UNCOMMITTED. Я возразил, что это не влияет, даже Serializable в этом случае прочитает список обновляется даже пока транзакция не завершена >даже Serializable в этом случае прочитает каким образом?
#28 by MrStomak
>список обновляется даже пока транзакция не завершена Спасибо, кэп, мне известна работа на уровне изоляций read uncommitted - на нём не ставятся блокировки в читающих запросах. >каким образом? Он скажет СУБД: хочу прочитать таблицу на Serializable, та посмотрит правила - так, мы должны наложить RangeS-S, но у нас уже есть U, посмотрит таблицу совместимости, ага, RangeS-S совместим с U, наложит блокировку RangeS-S и отдаст данные. Примерно так.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С