|
Как заблокировать запись регистра сведений на чтение? | ☑ | ||
---|---|---|---|---|
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 и отдаст данные. Примерно так. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |