Имя: Пароль:
1C
1С v8
Как заблокировать запись регистра сведений на чтение?
0 decdmb
 
04.10.13
10:42
Необходимо заблокировать выбираемую запись из периодического независимого регистра сведений на чтение (у конфы стоит режим упр. блок. - Автоматический):

ВЫБРАТЬ ПЕРВЫЕ 1
    СтатусыДокументовСрезПоследних.Объект,
    СтатусыДокументовСрезПоследних.Период,
    СтатусыДокументовСрезПоследних.Статус
ИЗ
    РегистрСведений.СтатусыДокументов.СрезПоследних КАК СтатусыДокументов
ГДЕ
    СтатусыДокументов.Статус = &Заполнен

ДЛЯ ИЗМЕНЕНИЯ

Про ДЛЯ ИЗМЕНЕНИЯ написано:
Предложение ДЛЯ ИЗМЕНЕНИЯ предназначено для указания необходимости блокировки считываемых в транзакции данных.

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

Что означает "Блокировка снимается после завершения транзакции."?
Т.е. чтение из регистра необходимо завернуть в НачатьТранзакцию() - ЗафиксироватьТранзакцию()?
Но про НачатьТранзакцию написано:
Транзакция предназначена для записи в информационную базу согласованных изменений.
Про блокировку на чтение не указано.
1 Wobland
 
04.10.13
10:43
на вот тебе слова умного человека о блокировках
http://1c.chistov.pro/2013/07/blog-post_25.html
2 decdmb
 
04.10.13
10:45
(1) Там про управляемые
3 decdmb
 
04.10.13
10:47
Можно ли использовать объект БлокировкаДанных при Автоматическом режиме и будет ли он работать?
4 ProgAL
 
04.10.13
10:55
Смысл в том что в каждом куске кода где вы хотите запретить чтение записи РС, предварительно надо делать
НачатьТранзакцию();

внутри ваш запрос с ДЛЯ ИЗМЕНЕНИЯ

ЗафиксироватьТраназакцию();

Аналогичный код должен быть во всех местах разных обработок или где откуда вы читаете свой регистр сведений.
Либо такой код ставите в одну конкретную обработку, при этом другой экземпляр обработки, запущенный другим пользователем, будет ждать завершения траназкции в первом экземпляре обработки.
5 ProgAL
 
04.10.13
10:56
Если вы свой код вызываете из обработки проведения или другого события , начинающего неявную транзакцию, то конструкции начать/зафиксировать транзакцию не нужны.
6 decdmb
 
04.10.13
11:01
(5) Понятно, просто смутило в описании НачатьТранзакцию() - Транзакция предназначена для записи в информационную базу согласованных изменений.
Про чтение там не  написано.
7 ProgAL
 
04.10.13
11:07
Код чиения выполняется только после наложения блокировки. В этом и весь смысл. Если блокировка не накладывается, то происходит ожидание на блокировке, либо дожидаемся когда она сможет наложится и выполнится нижестоящий код на чтение, либо отвалимся по таймауту.
8 MrStomak
 
04.10.13
11:10
ДЛЯ ИЗМЕНЕНИЯ не блокирует запись на чтение.
9 Господин ПЖ
 
04.10.13
11:13
>ДЛЯ ИЗМЕНЕНИЯ не блокирует запись на чтение.

здрасти приехали...

shared и sharedforupdate между собой уже не совместимы
10 MrStomak
 
04.10.13
11:15
11 Ненавижу 1С
 
гуру
04.10.13
11:20
(8) блокирует, проверил даже снова
а вот в списках форм действительно не блокируется
12 MrStomak
 
04.10.13
11:23
(11) Напиши в microsoft, что у них неверная таблица совместимости ;) U блокировка несовместима с другой U и с X. То есть запрос без конструкции "Для изменения" в транзакции легко сможет прочитать эти данные.
13 Господин ПЖ
 
04.10.13
11:26
(11) >а вот в списках форм действительно не блокируется

там везде nolock впендюривается...
14 MrStomak
 
04.10.13
11:29
(13) Да хоть Serializable, это не более чем RangeS будет..
15 Ненавижу 1С
 
гуру
04.10.13
11:29
(12) точно, в обоих случаях писал ДЛЯ ИЗМЕНЕНИЯ
16 Господин ПЖ
 
04.10.13
11:30
(14) я предлагаю не валить в кучу уровень изоляции и вид блокировки
17 бомболюк
 
04.10.13
11:30
(4) +100500
истина в последнем абзаце. к сожалению от чтения с nolock спасет только запуск реиндексации нужной таблицы, что лежит за рамками штатных возможностей в рантайме. надо везде при чтении ставить ДЛЯ ИЗМЕНЕНИЯ тоже.
18 MrStomak
 
04.10.13
11:31
(16) К чему тогда пассаж про nolock?
19 Господин ПЖ
 
04.10.13
11:32
я вот не помню "для изменения" во что трансформируется
20 Ненавижу 1С
 
гуру
04.10.13
11:32
меня другое смущает, вот код:

НачатьТранзакцию();
Валюта = Справочники.Валюты.НайтиПоКоду("840");
ТекстЗапроса = "ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют ГДЕ Валюта=&Валюта ДЛЯ ИЗМЕНЕНИЯ";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Валюта",Валюта);
Сообщить(Запрос.Выполнить().Выгрузить().Количество());
Предупреждение("!");
ЗафиксироватьТранзакцию();

и такой же код для другой валюты, написано что для скуля должно блокировать выбранные строки, а оно блокирует усе, но ведь валюты же разные!
21 Господин ПЖ
 
04.10.13
11:33
SIU?
22 Господин ПЖ
 
04.10.13
11:34
(20) зависит от размера таблицы и ее строения...

РС блокируется диапазонами... записи одной даты блокируются все насколько я помню
23 MrStomak
 
04.10.13
11:34
(20) если на serializable выполняется, то заблокирует соседние записи кластерного индекса вдовесок.
24 Господин ПЖ
 
04.10.13
11:35
(18) это специальный случай имхо... чистый селект + нолок
25 MrStomak
 
04.10.13
11:36
(18) nolock это указание СУБД использовать READ UNCOMMITTED. Я возразил, что это не влияет, даже Serializable в этом случае прочитает. Потом ты говоришь, что не надо приплетать уровни изоляций. Это несколько противоречиво.
26 Господин ПЖ
 
04.10.13
11:37
(25) >говоришь, что не надо приплетать уровни изоляций

я писал что не надо валить в кучу. а не "приплетать"
27 Господин ПЖ
 
04.10.13
11:42
>nolock это указание СУБД использовать READ UNCOMMITTED. Я возразил, что это не влияет, даже Serializable в этом случае прочитает

список обновляется даже пока транзакция не завершена

>даже Serializable в этом случае прочитает

каким образом?
28 MrStomak
 
04.10.13
11:45
>список обновляется даже пока транзакция не завершена
Спасибо, кэп, мне известна работа на уровне изоляций read uncommitted - на нём не ставятся блокировки в читающих запросах.
>каким образом?
Он скажет СУБД: хочу прочитать таблицу на Serializable, та посмотрит правила - так, мы должны наложить RangeS-S, но у нас уже есть U, посмотрит таблицу совместимости, ага, RangeS-S совместим с U, наложит блокировку RangeS-S и отдаст данные. Примерно так.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn